对于行为模型,我需要测试延时信号脉冲的宽度。
使用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
以下是测试模拟器的波形(从上到下,Modelsim,Icarus Verilog和GPL Cver - 后两者通过VCD文件和GTKWave,这可能是是clk2
故障没有出现但clk2_dalayed
的行为保持不变的原因:
正如你在时间50看到的那样,clk2
上存在一个(预期的)毛刺,它在其上升沿之后复位(复位发生了2个delta延迟,我认为)。
虽然传输延迟在10到20之间对clk2
脉冲起作用,但在时间50它似乎没有正确地表现出毛刺:只是第一个事件(上升沿)被传播并且clk2_delayed
奇怪地保持高位,即使它的源信号clk2
显然没有。
我能做些什么才能让故障完全延迟?