强制模块的内部信号 - Verilog

Force internal signal of a module - Verilog

我有一个 verilog 测试平台,用于执行模块的门级仿真。我想在模块内特定门的输出端注入一个瞬态电压,但找不到实现的方法。我可以在输入端插入瞬态电压(如毛刺)(如下例),但我需要注入内部信号。任何人都可以阐明这个问题吗?

示例:时钟信号中的毛刺 (source)

always begin: inject_clk_glitch
    #1 force clk = 1;
    #1 force clk = 0;
    #1 release clk;
end

force DUT.internal_path.internal_signal = 1;

如果您使用的是 Synopsys 等其他供应商,并且您希望从 systemverilog 强制转换为 VHDL,那么您需要使用 $hdl_xmr_force 供应商功能。 如果是布尔类型,则必须手动转换为 TRUE/FALSE。我认为 Questa 没有这个限制。

您可以在 systemverilog 界面或模块中添加任务,并使用层次结构 force/release 您的信号。

task force_deposit_output_sr_update( bit value=0);
`ifdef VCS
    if (value==0) begin
    $hdl_xmr_force("DUT.U01.U06.U02.U_USE_U03.U03.U01.UPDATE_SR_OUTPUT", "FALSE", "0 ps", "deposit",  , 0);
    end else begin
    $hdl_xmr_force("DUT.U01.U06.U02.U_USE_U03.U03.U01.UPDATE_SR_OUTPUT", "TRUE", "0 ps", "deposit",  , 0);
    end
`else
   //QUESTA
    force DUT.U01.U06.U02.U_USE_U03.U03.U01.UPDATE_SR_OUTPUT = value;//direct force DUT intern signal
 `endif
endtask

task force_deposit_output_change(logic[31:0]  value='hABCDABCD);
`ifdef VCS
    $hdl_xmr_force("dut.U01.U06.U02.U_USE_U03.U03.SYNC_OUTPUT", "value", "0 ps", "deposit",  , 0);
`endif
endtask