我经常需要模拟一种情况,即进入 FPGA 的输入信号要么存在严重毛刺,要么只是具有非常慢的上升/下降时间,这在实际设计中可能会导致亚稳态和信号毛刺。为了清理信号,我设计了一个“去抖”模块,每当发生这种情况时我都会使用该模块,并使用信号的理想行为来模拟我的设计。
我的问题与这种情况的模拟有关。特别是 - 如何获取任何测试平台生成的信号(在驱动程序类中),并使其在上升沿和下降沿随机出现故障。一切都在我给出的规格范围内。例如,我想模拟一个“干净”的按钮信号,并在发生任何转换时使其在低和高之间随机反弹,持续时间在 1 到 5 毫秒之间,最多 30 次。
有没有办法在 System Verilog 中有效地模拟此类行为?
我可以向您展示如何设置随机约束来满足您的故障规范。如果您有一个基于分类的测试平台(可能是 UVM),您可以使用下面示例中的覆盖行为来扩展您的驱动程序。在向您展示具体操作方法之前,我们需要了解您的测试平台是如何工作的。希望这对您来说是足够的信息:
module top;
timeunit 1ps/1ps;
logic dut_signal;
bit clk;
initial repeat (50) #50ms clk = !clk;
initial begin $dumpfile("dump.vcd"); $dumpvars; end
class transaction;
rand bit signal;
rand int unsigned bounces;
rand int unsigned delays[]; // in ns
constraint c {
bounces <=30;
delays.size() == bounces*2; // each bounce needs high/low delay
if (bounces > 0)
delays.sum() inside {[1ms/1ns:5ms/1ns]}; // all delays must be within 1-5ms
}
endclass
transaction tx = new;
always @(posedge clk)
begin
assert(tx.randomize);
$display("%p",tx);
if (dut_signal !== tx.signal) begin // only glitch when changing the value
dut_signal <= tx.signal;
foreach(tx.delays[i])
#(tx.delays[i]) dut_signal <= ! dut_signal;
end
end
endmodule