Verilog 垃圾输入不会导致垃圾输出
Verilog garbage input does not result in garbage output
我正在用 verilog 编写一个简单的控制单元。事情是这样的。
module controlUnit(
output reg wreg,
input wire [5:0] op, func
);
// wreg sub-handles. Beware: wreg is 0 if any of these s high
wire isBranch = (op[5:3] == 3'b0) & (|op[2:0]);
wire isStrWrd = op == 6'b101011;
wire isJumpReg = (op == 6'd0) & (func == 6'b001000);
// wreg handle
always @(*) begin
if(isBranch | isStrWrd | isJumpReg)
wreg <= op == 6'b000011;
else
wreg <= 1'b1;
end
endmodule
module testbench;
integer i;
wire out;
reg [11:0] in;
controlUnit CU0(
.wreg(out),
.op(in[11:6]), .func(in[5:0])
);
initial begin
$dumpfile("test.vcd");
$dumpvars(0, testbench);
#4 in = 0;
for(i=0; i<1024; i=i+1) begin
#1 in = i;
end
#1 in = 10'hXX; // Garbage input here
#1000;
end
endmodule
但是在模拟中,当输入变成垃圾时,wreg 信号是一个稳定的逻辑高电平。我在 iverilog-10/GTKwave 和 Vivado 2019.1 中看到了这种行为。以下是波形:
那么,为什么?
您只将 12 个输入位中的 10 个设置为 x
; 2 个 MSB 为 0。您应该将所有输入信号设置为 x
。这可能与您的问题无关,但我认为这是您的意图。变化:
#1 in = 10'hXX; // Garbage input here
至:
#1 in = {12{1'bx}}; // Garbage input here
当if(isBranch | isStrWrd | isJumpReg)
中的信号为x
时,if
为假,执行else
,将wreg
设置为1( wreg <= 1'b1
),而不是 x
。这回答了为什么 Verilog 模拟器在所有输入都是 x
时将 wreg
分配给 1 的问题。这就是模拟器设计的工作方式。
当输入为 x
:
时,使用三元运算符等效代码会将 wreg
设置为 x
always @(*) begin
wreg = (isBranch | isStrWrd | isJumpReg) ? (op == 6'b000011) : 1'b1;
end
请注意,对于组合逻辑,建议使用阻塞赋值 (=
)。
我正在用 verilog 编写一个简单的控制单元。事情是这样的。
module controlUnit(
output reg wreg,
input wire [5:0] op, func
);
// wreg sub-handles. Beware: wreg is 0 if any of these s high
wire isBranch = (op[5:3] == 3'b0) & (|op[2:0]);
wire isStrWrd = op == 6'b101011;
wire isJumpReg = (op == 6'd0) & (func == 6'b001000);
// wreg handle
always @(*) begin
if(isBranch | isStrWrd | isJumpReg)
wreg <= op == 6'b000011;
else
wreg <= 1'b1;
end
endmodule
module testbench;
integer i;
wire out;
reg [11:0] in;
controlUnit CU0(
.wreg(out),
.op(in[11:6]), .func(in[5:0])
);
initial begin
$dumpfile("test.vcd");
$dumpvars(0, testbench);
#4 in = 0;
for(i=0; i<1024; i=i+1) begin
#1 in = i;
end
#1 in = 10'hXX; // Garbage input here
#1000;
end
endmodule
但是在模拟中,当输入变成垃圾时,wreg 信号是一个稳定的逻辑高电平。我在 iverilog-10/GTKwave 和 Vivado 2019.1 中看到了这种行为。以下是波形:
那么,为什么?
您只将 12 个输入位中的 10 个设置为 x
; 2 个 MSB 为 0。您应该将所有输入信号设置为 x
。这可能与您的问题无关,但我认为这是您的意图。变化:
#1 in = 10'hXX; // Garbage input here
至:
#1 in = {12{1'bx}}; // Garbage input here
当if(isBranch | isStrWrd | isJumpReg)
中的信号为x
时,if
为假,执行else
,将wreg
设置为1( wreg <= 1'b1
),而不是 x
。这回答了为什么 Verilog 模拟器在所有输入都是 x
时将 wreg
分配给 1 的问题。这就是模拟器设计的工作方式。
当输入为 x
:
wreg
设置为 x
always @(*) begin
wreg = (isBranch | isStrWrd | isJumpReg) ? (op == 6'b000011) : 1'b1;
end
请注意,对于组合逻辑,建议使用阻塞赋值 (=
)。