这是我为简单仲裁者准备的代码
module arbiter(clk,rst,req,grnt,req_val);
input clk;
input rst;
input [3:0] req;
input [3:0] req_val;
output [3:0] grnt;
int j;
int i;
parameter A = 2'd0;
parameter B = 2'd1;
parameter C = 2'd2;
parameter D = 2'd3;
logic [1:0] current_state;
logic [1:0] next_state;
always_comb
begin
case (current_state)
D:
begin
grnt = 4'b1000;
j = 0;
for (i = 0; i<4;i++) begin
if (req[(j+i) % 4 ] == 1)
break;
end
case (i)
0: next_state = A;
1: next_state = B;
2: next_state = C;
3: next_state = D;
endcase
end
A:
begin
j = 1;
grnt = 4'b001;
for (i = 0; i<4;i++) begin
if (req[(i+j) % 4] == 1)
break;
end
case (i)
0: next_state = A;
1: next_state = B;
2: next_state = C;
3: next_state = D;
endcase
end
B:
begin
j = 2;
grnt = 4'b0010;
for (i = 0; i<4;i++ ) begin
if (req[(i+j) % 4] == 1)
break;
end
case (i)
0: next_state = A;
1: next_state = B;
2: next_state = C;
3: next_state = D;
endcase
end
C:
begin
j = 3;
grnt = 4'b0100;
for (i = 0; i<4;i++ ) begin
if (req[(i+j)% 4] == 1)
break;
end
case (i)
0: next_state = A;
1: next_state = B;
2: next_state = C;
3: next_state = D;
endcase
end
endcase
end
endmodule
always_ff@(posedge clk)
begin
current_state <= next_state;
end
endmodule
我收到以下错误:
arbitrer.sv(21):(vlog-2110)非法引用网络"grnt"。
和
arbitrer.sv(87):接近"always_ff":语法错误、意外always_ff、预期类。
那么grnt有什么问题呢?我不能直接分配给模块输出?
你的代码有两个问题。
-
您在代码中使用了两次
endmodule
语句。只需在第 86 行注释掉一个即可。 -
您尚未为
grnt
变量定义数据类型,因此默认情况下它是一个wire
,并且wire
不能在 always block 中使用,因此请将其声明为reg
/logic
。