AHB 的tb_ahb_svt_uvm_basic_ral_sys中关于slave和master接口连接的问题(这里代码不完整太多没有截完)
一、原始使用方法
hdl_interconnect中文件的DUT的部分内容是:
DUT外面还做了封装,封装成了ahb_svt_dut_sv_wrapper.sv,部分代码如下:
此DUT的作用是:
a.接收来自master的数据(这部分数据是传给slave的),传送给AHB bus,再由AHB bus传送给slave的interface。
b.接收自slave的数据,传送给AHB bus(AHB总线),再由AHB bus传送给master的interface。
注意顶层定义的是svt_ahb_if,其中包含有两个接口,一个是master_if,一个是slave_if。
top的部分代码:
svt_ahb_if部分代码,注意master_if和slave_if中的*_bus,最终会赋值给interface内部的*,比如hrdata_bus会赋值给master的hrdata,haddr_bus会赋值给salve的haddr(这里宏SVT_AHB_DISABLE_IMPLICIT_BUS_CONNECTION是没有定义的):
这里跑的ral_reg_write_read_test波形如下:
二、不使用ahb bus做中间转换的使用方法
如果我们还是定义svt_ahb_if,里面包含master_if和slave_if,但是不使用ahb bus做中间转换,那么顶层以及hdl_interconnnect中文件应该怎么写呢?即是否可以直接将master和slave的interface直接相连?答案,是可以的。(这样的情况不管怎样需要定义SVT_AHB_DISABLE_IMPLICIT_BUS_CONNECTION宏,否则会报出多驱动问题)
1.我们只需要修改ahb_svt_dut_sv_wrapper.sv,将ahb_if.*_bus换成对应的master或slave的接口,修改后的代码如下:
2.定义宏:
3.注意salve interface中有两个hready信号,其中一个hready是slave自己发出的,而hready_in则是slave要接收的(协议里面的interconnect给的,interconnect也会发送此signal给master),在原始方法中hready_bus最中会赋值给slave的hready_in和master的hready。这里由于没有使用ahb bus所以需要自己给slave的hready_in赋值。
dut和ahb_svt_dut_sv_wrapper.sv需要增加对slave的hready_in的赋值。修改ahb_svt_dut_sv_wrapper.sv和dut代码如下:
这里跑出来波形和上面是一样的。
三、
如果我们不定义svt_ahb_if,而只定义master_if和slave_if,那么顶层以及hdl_interconnnect中文件应该怎么写呢?(这种方式是最好理解的,但是并不是最好用的)
可以是可以,但是很麻烦,就上面的AHB给的例子代码会有很多要修改的地方。可能master和slave都需单独定义,但是这样vip env包好的很多组件都不能直接调用。(自己的观点)