请教verilog的问题
时间:12-12
整理:3721RD
点击:
以下round-robin的写法有没有问题?(功能)
module rr (
clk,
rst_n,
req,
gnt
);
input clk;
input rst_n;
input [3:0] req;
output [3:0] gnt;
reg [3:0] mask;
wire [7:0] sreq;
assign sreq = {req[3:0], req[3:0] & mask[3:0]} ;
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) begin
mask <= 4'b1111;
end
else if (gnt != 4'h0) begin
case (1'b1)
gnt[0] : mask <= 4'b1110 ;
gnt[1] : mask <= 4'b1100 ;
gnt[2] : mask <= 4'b1000 ;
gnt[3] : mask <= 4'b0000 ;
default: mask <= 4'b0000 ;
endcase
end
end
always @ (*) begin
case (1'b1)
sreq[0] : gnt = 4'b0001 ;
sreq[1] : gnt = 4'b0010 ;
sreq[2] : gnt = 4'b0100 ;
sreq[3] : gnt = 4'b1000 ;
sreq[4] : gnt = 4'b0001 ;
sreq[5] : gnt = 4'b0010 ;
sreq[6] : gnt = 4'b0100 ;
sreq[7] : gnt = 4'b1000 ;
default : gnt = 4'b0000 ;
endcase
end
endmodule
module rr (
clk,
rst_n,
req,
gnt
);
input clk;
input rst_n;
input [3:0] req;
output [3:0] gnt;
reg [3:0] mask;
wire [7:0] sreq;
assign sreq = {req[3:0], req[3:0] & mask[3:0]} ;
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) begin
mask <= 4'b1111;
end
else if (gnt != 4'h0) begin
case (1'b1)
gnt[0] : mask <= 4'b1110 ;
gnt[1] : mask <= 4'b1100 ;
gnt[2] : mask <= 4'b1000 ;
gnt[3] : mask <= 4'b0000 ;
default: mask <= 4'b0000 ;
endcase
end
end
always @ (*) begin
case (1'b1)
sreq[0] : gnt = 4'b0001 ;
sreq[1] : gnt = 4'b0010 ;
sreq[2] : gnt = 4'b0100 ;
sreq[3] : gnt = 4'b1000 ;
sreq[4] : gnt = 4'b0001 ;
sreq[5] : gnt = 4'b0010 ;
sreq[6] : gnt = 4'b0100 ;
sreq[7] : gnt = 4'b1000 ;
default : gnt = 4'b0000 ;
endcase
end
endmodule
always @ (*) begin
case (1'b1)
sreq[0] : gnt = 4'b0001 ;
sreq[1] : gnt = 4'b0010 ;
sreq[2] : gnt = 4'b0100 ;
sreq[3] : gnt = 4'b1000 ;
sreq[4] : gnt = 4'b0001 ;
sreq[5] : gnt = 4'b0010 ;
sreq[6] : gnt = 4'b0100 ;
sreq[7] : gnt = 4'b1000 ;
default : gnt = 4'b0000 ;
endcase
end
这个是不是存在多驱动的问题?
看cliff关于index型的onehot状态机编码的论文
里面讲得很清楚
case不能这么用吧,印象中case是并发执行的。你这样会出现多个分支满足的情况。
另外确认了一下always块里即使用的组合逻辑,那个gnt信号也要定义成reg。