行为Verilog建模:如何延迟故障?

时间:2018-01-08 01:22:18

标签: verilog

对于行为模型,我需要测试延时信号脉冲的宽度。

使用Verilog的creating a transport delay方式

always @(sig_in) sig_out <= #4 sig_in;

我能够使它适用于长度> 1的信号脉冲。 0但是对于我测试过的脉冲为0次毛刺的情况的三个模拟器来说,这是失败的。

以下是重现问题的小示例代码:

module main();
  reg rstn = 1;
  reg clk1 = 0;
  reg clk2 = 0;
  reg clk4 = 0;
  reg trigger = 0;

  initial begin
    $dumpfile("glitch_test.vcd");
    $dumpvars();
    #80; $finish;
  end

  always begin  // create base clock
    #10 clk1 = !clk1;
  end


  always @ (posedge clk1, negedge rstn) begin  // toggle-divided clock
    if (!rstn) clk2 <= 0;
    else clk2 <= !clk2;
  end

  always @ (posedge clk2, negedge rstn) begin  // toggle-divided clock
    if (!rstn) clk4 <= 0;
    else clk4 <= !clk4;
    if (clk4) trigger = 1;  // ...generate trigger to cause falling rstn edge
  end

  always @ (negedge clk4) begin
    if (trigger) rstn <= 0;
  end

  // Verilog transport-delayed version of clk2
  reg delayed_clk2;
  always @ (clk2) delayed_clk2 = #2 clk2;

endmodule    

以下是测试模拟器的波形(从上到下,ModelsimIcarus VerilogGPL Cver - 后两者通过VCD文件和GTKWave,这可能是是clk2故障没有出现但clk2_dalayed的行为保持不变的原因:

enter image description here

正如你在时间50看到的那样,clk2上存在一个(预期的)毛刺,它在其上升沿之后复位(复位发生了2个delta延迟,我认为)。

虽然传输延迟在10到20之间对clk2脉冲起作用,但在时间50它似乎没有正确地表现出毛刺:只是第一个事件(上升沿)被传播并且clk2_delayed奇怪地保持高位,即使它的源信号clk2显然没有。

我能做些什么才能让故障完全延迟?

0 个答案:

没有答案