UVM中testcase或sequence中如何force DUT的信号
以前用Systemverilog写testbench的时候,top中例化DUT和testcase,testcase里可以force DUT中的信号
但现在用UVM,在top module中例化了DUT,并且执行run_test(),
我想在testcase或sequence中对top module中的DUT内部的值临时force成某种时序,但会报error,请问有什么方法实现?谢谢。
兄弟,这个问题解决了没?我现在也遇到这个问题,我看别人端口上这么操作就没问题,但是我自己去force DUT内部信号就会报hireachical reference ....into xxx module is not allowed.
同求,有人解决了吗?
应该是要使用寄存器模型吧
还可以在 interface中写函数赋值,然后在 testcase中调用该函数
使用寄存器模型试试看是不是可以!
uvm_hdl_force
uvm_hdl_read
uvm_hdl_deposit
*7.3.3 使用interface进行后门访问操作
上一节中提到过在top_tb中使用绝对路径对寄存器进行后门访问操作,这需要更改top_tb.sv文件,但是这个文件一般是固定
的,不会因测试用例的不同而变化,所以这种方式的可操作性不强。在driver等组件中也可以使用这种绝对路径的方式进行后门访
问操作,但强烈建议不要在driver等验证平台的组件中使用绝对路径。这种方式的可移植性不强。
如果想在driver或monitor中使用后门访问,一种方法是使用接口。可以新建一个后门interface:
代码清单 7-21
文件:src/ch7/section7.3/7.3.3/backdoor_if.sv
4 interface backdoor_if(input clk, input rst_n);
5
6 function void poke_counter(input bit[31:0] value);
7 top_tb.my_dut.counter = value;
8 endfunction
9
10 function void peek_counter(output bit[31:0] value);
11 value = top_tb.my_dut.counter;
12 endfunction
13 endinterface
poke_counter为后门写,而peek_counter为后门读。在测试用例(或者drvier、scoreboard)中,若要对寄存器赋初值可以直接
调用此函数:
文件:src/ch7/section7.3/7.3.3/my_case0.sv
103 task my_case0::configure_phase(uvm_phase phase);
104 phase.raise_objection(this);
105 @(posedge vif.rst_n);
106 vif.poke_counter(32'hFFFD);
107 phase.drop_objection(this);
108 endtask
如果有n个寄存器,那么需要写n个poke函数,同时如果有读取要求的话,还要写n个peek函数,这限制了其使用,且此文件完
全没有任何移植性。
这种方式在实际中是有应用的,它适用于不想使用寄存器模型提供的后门访问或者根本不想建立寄存器模型,同时又必须要
对DUT中的一个寄存器或一块存储器(memory)进行后门访问操作的情况。
应急使用很好,赞一个
看到这个贴子眼熟,原来是几年前自己发的。谢谢大家的回复。
后来同事找到了uvm_hdl_force的方法。
最近刚从RTL设计转做验证,这个版块又要常来了。
你好 我最近也在做这个 但是路径怎么设置都不对这个函数具体怎么使用 你能说一下吗
难道发这个帖的时候不是做验证。