我正在尝试在SystemVerilog中实现惯性延迟以生成具有以下标准的信号valid_inputs
1.如果没有输入是X / Z,valid_inputs
应在延迟一段时间后(例如15个单位)变为'1'
2.如果至少一个输入变为X / Z,则valid_inputs
应立即变为“0”。
我正在尝试上面的两个实现:
module test (a, b, y);
input a, b;
output y;
wire temp;
assign temp = ^{a,b};
bit valid_inputs_temp, valid_inputs_2;
wire valid_inputs;
always @(temp)
begin
if (temp === 1'b1 || temp === 1'b0)
begin
valid_inputs_temp <= 1'b1;
end
else
begin
valid_inputs_temp <= 1'b0;
end
end
assign #(15,0) valid_inputs = valid_inputs_temp;
always @(temp)
begin
if (temp === 1'b1 || temp === 1'b0)
begin
#15 valid_inputs_2 <= 1'b1;
end
else
begin
valid_inputs_2 <= 1'b0;
end
end
endmodule
虽然信号valid_inputs
完美无缺,但我不确定为什么valid_inputs_2
不能完全相同?有没有办法可以使用always
- begin
程序代码实现惯性延迟?
请注意,虽然我可以修改上述代码中的assign
语句,但我完全删除了相应的always
- begin
块,出于某种原因我需要使用{ {1}} - always
编码风格。
谢谢, 维纳亚克
答案 0 :(得分:0)
第二个always
阻止无效的原因是您有一个阻止#15
延迟。如果它发生在少于15个时间单位中,则暂停始终进程并错过temp
上的更改。您需要将延迟移至<=
的另一侧,以便它成为非阻塞分配延迟。
valid_inputs_2 <= #15 1'b1;
如果您对always
块的执行方式感到困惑,请参阅this link.
答案 1 :(得分:0)
这不是惯性延迟的一个很好的例子。原因是任何0-> 1或1-> 0转换都会使输出为1。因此,脉冲在逻辑上不会引起输出的任何差异。
因此无法将其与传输延迟区分开。
此外,输出立即将z变为0。因此,这也没有延迟。 因此,信号“ valid_inputs_2”是传输延迟(<=#15)。
据我所知,无法使用Always Block创建惯性延迟。