请问SystemVerilog在class中该怎样使用for循环呢?
用基本的写法是可以的,即
force tb.A[0] = tb.B[199];
force tb.A[1] = tb.B[198];
...
force tb.A[198] = tb.B[1];
force tb.A[199] = tb.B[0];
上面这样写可以通过编译。
但这样写显然太冗长,因此考虑用for循环
for (i=0;i<=199;i++)
begin
force tb.A[i] = tb.B[199-i];
end
但结果是,上面的写法 ,无论变量i是定义在class中,还是tb中(定义在tb中时上面写为tb.i),编译都会报错.
也尝试过用generate语句,仍然报错。
觉得这些写法在普通的tb中应该是可以的,但在class中好像就不行,暂时不知道原因……
原以为是一个简单的事情,但还真就是被卡住了……问了周围的同事也都没有想出解决办法。
不知有哪位兄台能指点一下呢?谢谢!:)
如果你的目的是逆序而不是写个class练手的话,
tmp_a = {<<{tb.B}};
force tb.A = tmp_a;
.53
可不可以在task中定义?有试过吗?
首先这种东西一般是写在tb里面的,你class里面的东西还是最好通过interface跟DUT/TB打交道,而不是直接hierarchical的去reference
第二个force这种玩意要写在initial语句里,印象里没法generate
第三个force的东西里面的signal是要能够static确认的,可以看看编译器有没有什么静态展开的选项
你可以把完整代码贴出来看看
谢谢楼上几位兄台哈!:)
完整代码就是写在一个uvm_sequence的body里面,如下:
task body();
raise_objection ...
for (i=0;i<=199;i++) begin
force tb.A[i] = tb.B[199-i];
end
drop_objection ...
endtask
上面的写法就会编译错误。
而如果按下面这样写,编译就能通过,波形也对。
task body();
raise_objection ...
force tb.A[0] = tb.B[199];
force tb.A[1] = tb.B[198];
...
force tb.A[198] = tb.B[1];
force tb.A[199] = tb.B[0];
drop_objection ...
endtask
我也觉得可能与static有关,但对这方面的知识不足,因此无法找到原因及解决办法,恳请几位兄台多多指教~~~:)
※ FROM: 210.13.97]
※ 来源:·水木社区 http://www.newsmth.net·[FROM: 210.13.97]
尽量通过interface进行赋值操作。在class中可以使用uvm_hdl_force,不过只能force源信号的当前值。
※ FROM: 118.201.88]
※ 来源:·水木社区 http://www.newsmth.net·[FROM: 118.201.88]
就不能写成这样?
for ( int I=0; I < 200; I =I + 1)
force blabla
可以先声明一个等宽的logic ,用for给这个新变量赋值,然后用新变量整体force