强制模块的内部信号 - 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
我有一个 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