我想模拟一个具有简单Addr / Data接口的模块。我想创建一个单独的模块,作为该模块的交易者。因此,例如,我可以简单地在transactor模块中调用一个任务来执行addr和数据的写入。 e.g。
Transactor.Write_Task(0, 123); //Writes 123 to Addr 0.
我的问题是,我应该include
将transactor模块包含在测试平台的顶部吗?或者,它是一种更好的方法来单独编译交易器并实例化它并将其连接起来,就像它是另一个被测单元一样? e.g:
\lib_Local_Bus.Local_Bus_Transactor Transactor
(
.i_LB_Clk(w_LB_Clk),
.o_LB_CS(w_LB_CS),
.o_LB_Wr_Rd_n(w_LB_Wr_Rd_n),
.o_LB_Addr8(w_LB_Addr8),
.o_LB_Wr_Data(w_LB_Wr_Data),
.i_LB_Rd_Data(w_LB_Rd_Data),
.i_LB_Rd_DV(w_LB_Rd_DV)
);
我觉得简单地用include
包含它更容易,但是我需要正确指出它,这可能是一个问题。通过预编译,像UUT一样对它进行实例化,并将其连接起来,代码更多,但对于发生的事情它更为直接。
答案 0 :(得分:0)
经典方法是将其视为任何其他模块,这意味着它作为自己的文件存在,并且您在顶级测试平台中实例化交易器和DUT。这就是我所研究的大多数香草Verilog环境的编码方式。
模块可以提供基于队列的接口以将事务排入队列,也可以基于任务的接口,然后可以从测试中调用,例如
initial
begin : test_block
Transactor.Send(data1);
->stimulus_complete;
end