0.breakpoint
-
设置断点:测试文件编译compile并仿真simulate后,在sim窗口双击文件可打开代码编辑窗口进行"设置断点”操作,双击想要插入断点行的左侧行数数字后处即可插入断点,右键该断点可进行设置。之后可以多次run,来查看不同阶段变量的数值大小和变化情况。运行到断点处表示:刚执行到这一行,还没执行该行。
-
Locals窗口可查看局部动态变量;
-
Objects窗口查看硬件静态变量;
-
在function外声明一个int类型的result(默认是静态变量,静态变量是全局变量,不会随着函数的结束而消失),上一次执行的function的result值会返回到result,然后在进行下一次function。
-
在function内部声明一个(动态变量,动态变量是局部变量,函数执行完后会销毁)int类型的result,每次执行的function都会初始化result值。
1.tb1
-
相比于lab1利用三个动态数组产生data,lab2将产生data的功能封装进了chnl_generator类。
-
⭐️在class类中声明interface接口的指针,之前必须加关键词“virtual”,不加编译会报错。
-
此时发送的数据封装到一个class(chnl_trans)中,该class中包括data/id/num三个变量,此时可用struct代替,但此后会对数据做一些操作(拷贝/比较/打印)等,只能放到class中。
-
clocking时钟块可以定义在interface接口中,也可定义在module和program中,例如:
clocking drv_ck @(posedge clk);
default input #1ns output #1ns; //表示在clk上升沿前1ns对input信号采样,clk上升沿后1ns驱动output信号
output ch_data, ch_valid;
input ch_ready, ch_margin;
endclocking
- 需要调用时钟块对变量进行采样和驱动时,按照层次化调用该变量即可,例如:
@(posedge clk); intf.drv_ck.ch_valid <= 1;
表示调用接口(intf)中的时钟块(drv_ck)所定义的采样和驱动延时规定对变量ch_valid进行赋值(即驱动)。
-
🐛接口中的信号必须采用非阻塞赋值(<=)来驱动(同步驱动)。
-
可利用“repeat(idle_cyles) chnl_idles();”对数据发送空闲周期任务进行参数化次数控制,进而控制相邻数据间的空闲间隔。
2.tb2
- 想要实现:等三个通道都拉低ready(但不必同时拉低,先后拉低即可)。需要利用“fork_join"语句使得等待三个FIFO写满语句并行运行,并在三个FIFO都写满时(ready都拉低)结束该线程。
3.tb3
- class类要封装在一个“盒子”中,可以是“module/interface/program/package”,一般用package包来封装多个class。
- 调用package包中的class类时,要先导入该包:“ import xxx_pkg:: * ”,星号代表导入该包中的所有类。
4.tb4
- 一个函数的所传入的形式参数不能再作为形式参数直接传入该函数中的被调用函数?(并不是!!!把第5和15行删了,也不影响)该变量(vif)的作用在于:后续在chnl_fifo_full_test中要等ch_magin信号为0,也要通过chnl_agent调用vif中的chnl_margin信号,如果在agent中不声明一个存放vif句柄的变量,那么从外部便链接不到接口。
class chnl_agent;
chnl_generator gen;
chnl_initiator init;
local int ntrans; //hsy: keyword "local" means this variable can't be used by child class. "ntrans"----controls the number of writing trans.
local virtual chnl_intf vif; //hsy: 这里声明了chnl_intf类型的接口对象,将set_interface函数中外部传进来的形式参数赋给该变量,再在16行调用init的set_interface函数时作为形参传入。
function new(string name = "chnl_agent", int id = 0, int ntrans = 1);
this.gen = new(id);
this.init = new(name);
this.ntrans = ntrans;
endfunction
function void set_ntrans(int n);
this.ntrans = n;
endfunction
function void set_interface(virtual chnl_intf vif);
this.vif = vif;
init.set_interface(vif);
endfunction
task run();
repeat(this.ntrans) this.init.chnl_write(this.gen.get_trans());
endtask
endclass: chnl_agent
- 🐛注意:源tb4代码中chnl_pkg::chnl_agent::vif声明的是:local类型,即不能被子类或任何外部代码调用,所以在chnl_pkg::chnl_fifo_full_test::run中调用agent[0/1/2].vif.chnl_margin时会提示“illegal access to local member agent[0].vif.ch_margin.”,把限定local去掉即可。