| ||
“Cocotb系列”前面的文章中有提到过我们对信号的驱动的方式如红框所示:
Cocotb平台使用“dut”关键词来作为被验证模块的句柄,由该句柄来指向其端口或内部层次的信号。如上图示例中所表达的含义是对一个加法器的端口A和B分别赋值,check 输出端口X的值是否等于参考模块A+B的计算结果。
关键词“dut”如何指向被验证模块的顶层模块名,其系统内部连接关系在系统文件__init__.py中体现:
从上图中我们看出,由Makefile中定义好的"TOPLEVEL",在__init__.py系统函数中经过"root_name"、"handle"的传递而传递到"dut"句柄上。从而"dut"句柄则代表了被验证模块的顶层模块名。
如何给信号分配值,可以采用两种方式:
一、使用句柄的value属性给信号赋值
二、通过信号层次直接对信号赋值
我们还可以通过信号的层次对内部信号做赋值
注:笔者使用Cocotb 1.4.0版本在VCS仿真器下驱动一个带有generate例化的信号时,如dut.sub_block.GEN_INST[0].memory.data <= 2,信号层次中由于使用了generate语法而多出来的"GEN_INST[0]"使得仿真器内部无法得到信号的句柄,从而无法对信号做驱动,参照issue:https://github.com/cocotb/cocotb/issues/2190
"sig <= new_value"赋值方式是"sig.value = new_value"赋值方式的一种简写形式。两种方式均不会立即写入到端口,而是会延迟到下一个写周期生效。如果需要使赋值即时生效,可以使用“setimmediatevalue()”系统函数,赋值方式如下:sig.setimmediatevalue(new_val)。
针对信号的有符号和无符号赋值,可以参考如下的赋值方式,如针对一个位宽3bit的data_in做有符号赋值:
当赋值超过信号的位宽,cocotb则会报Overflow相关ERROR
对信号的操作除了基本的赋值以外,还可以做信号的Force/Freeze/Release等操作,使用方法如下:
有了如上信号驱动的方法,用户可以根据不同模块的业务特点来构造不同类别的激励。
内容如有错误还请各位指正,欢迎各位读者交流经验。邮箱:xiaochuan7206043@163.com