以多种方式实施惯性延迟

时间:2017-09-25 12:15:00

标签: system-verilog

我正在尝试在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编码风格。

谢谢, 维纳亚克

2 个答案:

答案 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创建惯性延迟。