Ввод мусора Verilog не приводит к выводу мусора
Я пишу простой блок управления в 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 является сплошным логическим HIGH, когда входной сигнал становится мусором. Я видел такое поведение с iverilog-10/GTKwave и Vivado 2019.1. Ниже приведена форма волны:
Итак, почему?
1 ответ
Вы устанавливаете только 10 из 12 входных битов на
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 назначает
wreg
к 1, когда все входы
x
. Именно так и устроен тренажер.
Использование эквивалентного кода тернарного оператора установит
wreg
к
x
когда входы
x
:
always @(*) begin
wreg = (isBranch | isStrWrd | isJumpReg) ? (op == 6'b000011) : 1'b1;
end
Обратите внимание, что использование блокирующего назначения (=
) рекомендуется для комбинационной логики.