次のように設定されたアービターモジュールがあります。
// Code your design here
module arbiter#(parameter WIDTH=3)(
input clk,rst,
input [WIDTH-1:0] in,
output reg [WIDTH-1:0] out
);
parameter IDLE=3'b0,G1=3'b001,G2=3'b010,G3=3'b100;
reg [WIDTH-1:0] state;
wire [WIDTH-1:0] nextState;
always@(posedge clk)
if (rst==1'b1)begin
state<=3'b000;
out=3'b000;
end else begin
case (state)
IDLE:if (in==3'b000) begin
state=IDLE;
out=IDLE;
end else if (in == 3'b001)begin
state=G1;
out=G1;
end else if (in == 3'b010 | in==3'b011) begin
state=G2;
out=G2;
end else if (in == 3'b100 | in==3'b101| in==3'b110| in==3'b111) begin
state=G3;
out=G3;
end
G1:if (in==3'bxx1) begin
state=G1;
out=G1;
end else if (in==3'bxx0)begin
state=IDLE;
out=IDLE;
end
G2:if (in==3'bx0x) begin
state=IDLE;
out=IDLE;
end else if (in==3'bx1x)begin
state=G2;
out=G2;
end
G3:if (in==3'b1xx) begin
state=G3;
out=G3;
end else if (in==3'b0xx)begin
state=IDLE;
out=IDLE;
end
endcase
end
endmodule
私のテストベンチは次のとおりです。
module basic_and_tb();
reg [2:0] a;
wire [2:0] out;
reg clk,rst;
arbiter uut(.clk(clk),.rst(rst),.in(a),.out(out));
initial clk=1'b0;
always #5 begin
clk=~clk;
end
initial begin
rst=1'b1;
#10rst=1'b0;
a=3'b000; $display("%b",out);
#10 a=3'b010; $display("%b",out);
#30 a=3'b011; $display("%b",out);
#10 a=3'b000; $display("%b",out);
#10 a=3'b100;$display("%b",out);
#10 a=3'b101;$display("%b",out);
#20 a=3'b011;$display("%b",out);
#20 a=3'b010;$display("%b",out);
#20 a=3'b000;$display("%b",out);
#10 a=3'b100;$display("%b",out);
#20 a=3'b000;$display("%b",out);
#1 $display("%b",out);
#10 $finish;
end
endmodule
しかし、私が得る出力は
000
000
010
010
010
010
010
010
010
010
010
010
どの時点でも、出力の 1 ビットのみが High になります。アイドル状態の間に要求入力がアサートされると、回路は出力の対応するビットをアサートすることによってその要求を許可する必要があります。これは、対応する入力ビットがデアサートされるまでハイのままである必要があり、その時点で回路はアイドル状態に移行する必要があります。複数の入力ビットがアサートされると、最も優先度の高い要求が許可され、一番左のビットが最も優先度が高くなります。しかし、私の出力は最後まで 010 のままです。何が悪かったのか?