问一个笔试题
时间: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 怎么写?
: ~~~
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 怎么写?
: ~~~