第一个大概的 uvm 例子及相关坑
-
首先讲讲vhdl的加法运算的坑
使用vhdl写了一个两个数相加的module,signal定义为std_logic_vector类型,然后直接使用一个process根据valid的脉冲做加法运算。
自己也注意到了加法、乘法等溢出问题,但是编译总是报左右位宽不匹配。然后才发现vhdl不允许vector类型数据直接相加,需要先做类 型转换。 -
定义integer类型signal
-
使用CONV_INTEGER(signal name)转换
-
两个integer做自加运算后在转为vector 类型交付接口。 这里可以直接写为result <= CONV_STD_LOGIC_VECTOR(A+B,9).。讲integer类型的a+b结果转为9bit的std_logic_vector
-
然后开始搭第一个简单的testbench
-
首先定义接口interface,其就是monitor、scoreboard,dut间的交互接口,其中接口定义dut需要的输入输出signal及数据传递task(有时序)
-
接着写数据生成模块,使用$random 生成数据交付bfm,
-
写dut模块,简单数据加法运算
-
使用接口激励dut,并且将dut输出赋值接口中的某个信号
-
编写scoreboard,根据时序采集dut数据输出,使用接口中信号自己做相同运算。然后比对数据,使用打印信息显示log日志