微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 问一个笔试题

问一个笔试题

时间:12-12 整理:3721RD 点击:
☆─────────────────────────────────────☆
   benckey () 于  (Tue Nov 30 12:52:07 2010)  提到:
Design a round-robin arbiter(轮换仲裁) that can accept 8 requests and give grant signals in one cycle.
谢谢
☆─────────────────────────────────────☆
   BOIS (栏杆拍遍) 于  (Tue Nov 30 14:05:19 2010)  提到:
无聊,随手写了个。好像dw有可以利用的cell的。
下次考你Weighted-Round-Robin arbiter。。。。
更新了一下,看看function还有没有什么问题。代码优化、coding style可参考跟贴意见。
module RR(
   // Clk and Rst
   clk,
   rst,
  
   // Inputs
   en,
   req,
  
   // Outputs
   gnt,
   preGnt
);
input clk;
input rst,
input        en;
input  [7:0] req;
output [7:0] gnt;    // one-hot
output [7:0] preGnt; // one-hot
reg    [7:0] preGnt;
wire   [7:0] masked;
wire   [7:0] gntH;
wire   [7:0] gntL;
Mask uMask(
  .preGnt ( preGnt[7:0] ),
  .mask   ( masked[7:0] )
);
wire [7:0] maskedReq = req[7:0] & masked[7:0];
wire       useMasked = |maskedReq[7:0];
wire [7:0] gnt = useMasked? gntH[7:0] : gntL[7:0];
Gnt uGntH (
   .req ( maskedReq[7:0] ),
   .gnt ( gntH[7:0]      )
);
Gnt uGntL (
   .req ( req[7:0] ),
   .gnt ( gntL[7:0])
);
always@(posedge clk) begin
   if(~rst)
      preGnt <= 8'h00;
   else if (en)
      preGnt <= gnt;
end
endmodule
module Gnt (
   // Inputs
   req,
   // Outputs
   gnt
);
input  [7:0] req;
output [7:0] gnt;
reg    [7:0] gnt;
always @(*) begin
   casex(req)
      8'b????_???1: gnt = 8'b0000_0001;
      8'b????_??10: gnt = 8'b0000_0010;
      8'b????_?100: gnt = 8'b0000_0100;
      8'b????_1000: gnt = 8'b0000_1000;
      8'b???1_0000: gnt = 8'b0001_0000;
      8'b??10_0000: gnt = 8'b0010_0000;
      8'b?100_0000: gnt = 8'b0100_0000;
      8'b1000_0000: gnt = 8'b1000_0000;
      default     : gnt = 8'b0000_0000;    
end
    
endmodule
module Mask(
   // Inputs
   preGnt,
  
   // Outputs
   mask
);
input  [7:0] preGnt;
output [7:0] mask;
reg [7:0] mask;
always @(*) begin
   case(1'b1) // synopsys parallel_case full_case
      preGnt[0]: mask[7:0] = 8'hfe;
      preGnt[1]: mask[7:0] = 8'hfc;
      preGnt[2]: mask[7:0] = 8'hf8;
      preGnt[3]: mask[7:0] = 8'hf0;
      preGnt[4]: mask[7:0] = 8'he0;
      preGnt[5]: mask[7:0] = 8'hc0;
      preGnt[6]: mask[7:0] = 8'h80;
      preGnt[7]: mask[7:0] = 8'hff;
      default  : mask[7:0] = 8'hff;
   endcase
end
endmodule
【 在 benckey () 的大作中提到: 】
: Design a round-robin arbiter(轮换仲裁) that can accept 8 requests and give grant signals in one cycle.
: 谢谢
☆─────────────────────────────────────☆
   benckey () 于  (Tue Nov 30 17:05:00 2010)  提到:
先谢谢啦,研究研究,呵呵
【 在 BOIS (栏杆拍遍) 的大作中提到: 】
: 无聊,随手写了个。好像dw有可以利用的cell的。
: 下次考你Weighted-Round-Robin arbiter。。。。
: module RR(
: ...................
☆─────────────────────────────────────☆
   Xaoyao (玄之又玄) 于  (Wed Dec  1 01:41:40 2010)  提到:
这个gnt似乎会生成latch
【 在 BOIS (栏杆拍遍) 的大作中提到: 】
: 无聊,随手写了个。好像dw有可以利用的cell的。
: 下次考你Weighted-Round-Robin arbiter。。。。
: module RR(
: ...................
☆─────────────────────────────────────☆
   BOIS (栏杆拍遍) 于  (Wed Dec  1 07:51:49 2010)  提到:
哎呀丢脸了,少写了个default
【 在 Xaoyao (玄之又玄) 的大作中提到: 】
: 这个gnt似乎会生成latch
☆─────────────────────────────────────☆
   benckey () 于  (Wed Dec  1 12:09:31 2010)  提到:
wire [7:0] maskedReq = req[7:0] & masked[7:0];
always @(*) begin
   casex(maskedReq)
      8'b????_???1: gnt = 8'b0000_0001;
      8'b????_??10: gnt = 8'b0000_0010;
      8'b????_?100: gnt = 8'b0000_0100;
      8'b????_1000: gnt = 8'b0000_1000;
      8'b???1_0000: gnt = 8'b0001_0000;
      8'b??10_0000: gnt = 8'b0010_0000;
      8'b?100_0000: gnt = 8'b0100_0000;
      8'b1000_0000: gnt = 8'b1000_0000;
      default     : gnt = 8'b0000_0000;    
end
感觉这一段不完善,是否应该写成这样:
wire [15:0] maskedReq = {req[7:0] & ~masked[7:0], req[7:0] & masked[7:0]};
always @(*) begin
   casex(maskedReq)
      16'b????_????_????_???1: gnt = 8'b0000_0001;
      16'b????_????_????_??10: gnt = 8'b0000_0010;
      16'b????_????_????_?100: gnt = 8'b0000_0100;
      16'b????_????_????_1000: gnt = 8'b0000_1000;
      16'b????_????_???1_0000: gnt = 8'b0001_0000;
      16'b????_????_??10_0000: gnt = 8'b0010_0000;
      16'b????_????_?100_0000: gnt = 8'b0100_0000;
      16'b????_????_1000_0000: gnt = 8'b1000_0000;
      16'b????_???1_0000_0000: gnt = 8'b0000_0001;
      ....
      default                : gnt = 8'b0000_0000;    
end
【 在 BOIS (栏杆拍遍) 的大作中提到: 】
: 无聊,随手写了个。好像dw有可以利用的cell的。
: 下次考你Weighted-Round-Robin arbiter。。。。
: module RR(
: ...................
☆─────────────────────────────────────☆
   feelthesame (我除了粗犷还是粗犷) 于  (Wed Dec  1 12:50:29 2010)  提到:
casex和case(1'b1)这种东西,很多公司的规范不让写的
【 在 BOIS (栏杆拍遍) 的大作中提到: 】
: 无聊,随手写了个。好像dw有可以利用的cell的。
: 下次考你Weighted-Round-Robin arbiter。。。。
: module RR(
: ...................
☆─────────────────────────────────────☆
   Xaoyao (玄之又玄) 于  (Wed Dec  1 14:53:39 2010)  提到:
推荐个写法
wire [7:0] gnt;
assign gnt[0] = maskedReq[0];
assign gnt[1] = maskedReq[1] && !maskedReq[0];
assign gnt[2] = maskedReq[2] && !(|maskedReq[1:0]);
assign gnt[3] = maskedReq[3] && !(|maskedReq[2:0]);
assign gnt[4] = maskedReq[4] && !(|maskedReq[3:0]);
assign gnt[5] = maskedReq[5] && !(|maskedReq[4:0]);
assign gnt[6] = maskedReq[6] && !(|maskedReq[5:0]);
assign gnt[7] = maskedReq[7] && !(|maskedReq[6:0]);
【 在 feelthesame (我除了粗犷还是粗犷) 的大作中提到: 】
: casex和case(1'b1)这种东西,很多公司的规范不让写的
☆─────────────────────────────────────☆
   BOIS (栏杆拍遍) 于  (Wed Dec  1 15:51:01 2010)  提到:
更新了,再看看。
好久没出过bug了,因为好久没写过rtl了。用进废退啊~
【 在 benckey () 的大作中提到: 】
: wire [7:0] maskedReq = req[7:0] & masked[7:0];
: always @(*) begin
:    casex(maskedReq)
: ...................
☆─────────────────────────────────────☆
   BOIS (栏杆拍遍) 于  (Wed Dec  1 16:06:32 2010)  提到:
赞~
开个玩笑,人肉综合器啊~
我曾经也很崇尚人工来做这样的优化。但后来由于实际项目中写就的code可能经常由于有新的需求需要不断的更新,很多手工优化后的code比较难读,维护起来比较麻烦、费时,并且容易出bug。经过一番比较后,发现DC这玩意其实已经很聪明了~于是人就越变越懒了。
不过,一般还是不建议大家偷懒,很多人有的是时间,具体问题具体分析,呵呵
【 在 Xaoyao (玄之又玄) 的大作中提到: 】
: 推荐个写法
: wire [7:0] gnt;
: assign gnt[0] = maskedReq[0];
: ...................
☆─────────────────────────────────────☆
   benckey () 于  (Wed Dec  1 17:28:25 2010)  提到:
Weighted-Round-Robin arbiter 怎么写?
~~~
【 在 BOIS (栏杆拍遍) 的大作中提到: 】
: 无聊,随手写了个。好像dw有可以利用的cell的。
: 下次考你Weighted-Round-Robin arbiter。。。。
: 更新了一下,看看function还有没有什么问题。代码优化、coding style可参考跟贴意见。
: ...................
☆─────────────────────────────────────☆
   janefeier (Forget it!) 于  (Wed Dec  1 18:26:57 2010)  提到:
casex 改为casez
【 在 feelthesame (我除了粗犷还是粗犷) 的大作中提到: 】
: casex和case(1'b1)这种东西,很多公司的规范不让写的
☆─────────────────────────────────────☆
   wowotou (窝窝头) 于  (Wed Dec  1 19:16:25 2010)  提到:
这个要有token。还是比较麻烦的
【 在 benckey () 的大作中提到: 】
: Weighted-Round-Robin arbiter 怎么写?
: ~~~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top