如何在 systemverilog 类中生成“故障”信号

问题描述 投票:0回答:1

我经常需要模拟一种情况,即进入 FPGA 的输入信号要么存在严重毛刺,要么只是具有非常慢的上升/下降时间,这在实际设计中可能会导致亚稳态和信号毛刺。为了清理信号,我设计了一个“去抖”模块,每当发生这种情况时我都会使用该模块,并使用信号的理想行为来模拟我的设计。

我的问题与这种情况的模拟有关。特别是 - 如何获取任何测试平台生成的信号(在驱动程序类中),并使其在上升沿和下降沿随机出现故障。一切都在我给出的规格范围内。例如,我想模拟一个“干净”的按钮信号,并在发生任何转换时使其在低和高之间随机反弹,持续时间在 1 到 5 毫秒之间,最多 30 次。

有没有办法在 System Verilog 中有效地模拟此类行为?

system-verilog randomized-algorithm
1个回答
0
投票

我可以向您展示如何设置随机约束来满足您的故障规范。如果您有一个基于分类的测试平台(可能是 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
© www.soinside.com 2019 - 2024. All rights reserved.