我正在用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的这种行为。波形如下:

那么,为什么?
发布于 2020-10-23 12:46:12
您只将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。这就回答了为什么当所有输入都是wreg时,Verilog模拟器将x分配给1。这是模拟器设计的工作方式。
当输入为wreg时,使用三元操作符等效代码将x设置为x
always @(*) begin
wreg = (isBranch | isStrWrd | isJumpReg) ? (op == 6'b000011) : 1'b1;
end请注意,对于组合逻辑,建议使用阻塞分配(=)。
https://stackoverflow.com/questions/64499894
复制相似问题