微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 请问SystemVerilog在class中该怎样使用for循环呢?

请问SystemVerilog在class中该怎样使用for循环呢?

时间:12-12 整理:3721RD 点击:
小弟想写一个简单的case: 在class中,把tb中的A、B信号逆序force起来。
用基本的写法是可以的,即
     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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top