Verilog 用于模拟的模块实例

Verilog 用于模拟的模块实例,verilog,Verilog,我想模拟一个具有简单Addr/数据接口的模块。我想创建一个单独的模块,作为此模块的事务处理程序。例如,我可以简单地调用Transactior模块中的一个任务,该任务将执行addr和数据的写入。e、 g Transactor.Write_Task(0, 123); //Writes 123 to Addr 0. 我的问题是,我是否应该执行一个include,将Transactior模块包含在测试台的顶部?或者单独编译事务处理程序并实例化它并将其连接起来,就像它是另一个正在测试的单元一样,这是一种

我想模拟一个具有简单Addr/数据接口的模块。我想创建一个单独的模块,作为此模块的事务处理程序。例如,我可以简单地调用Transactior模块中的一个任务,该任务将执行addr和数据的写入。e、 g

Transactor.Write_Task(0, 123); //Writes 123 to Addr 0.
我的问题是,我是否应该执行一个
include
,将Transactior模块包含在测试台的顶部?或者单独编译事务处理程序并实例化它并将其连接起来,就像它是另一个正在测试的单元一样,这是一种更好的方法吗?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一样实例化,并将其连接起来,有更多的代码,但对于正在发生的事情,它更简单。

经典的方法是将它视为任何其他模块,这意味着它作为自己的文件存在,您可以在顶级测试台上将事务处理程序和DUT一起实例化。这就是我工作过的大多数普通Verilog环境的编码方式

该模块可以提供一个基于队列的接口将事务排入队列,也可以提供一个基于任务的接口,然后可以从测试中调用该接口,例如

  initial
    begin : test_block
      Transactor.Send(data1);
      ->stimulus_complete;
    end

你为什么不把这两个文件编译成两个独立的文件呢?@Ari,我相信这就是我在使用
include
的地方所做的事情。每个事务处理程序和测试台都在各自的文件中。当我将事务处理程序包括在TB中时,它会将它们编译在一起。与测试台顶部相关的调用这些任务的测试在哪里?您有权访问SystemVerilog吗?它有很多功能可以帮助您组织测试台并使其更具可重用性。@dave_59,在最简单的情况下,测试台将调用这些任务。是的,我可以用SystemVerilog。你的意思是什么?你能给我举个例子吗?@Russel有什么理由让你的事务处理程序作为一个模块而不是一个类?如果在这种情况下使用类来封装所有内存接口事务可能更好。如果您真的想成为一名花花公子,您可以使用OVM并使用其建议的框架(幸好您有SystemVerilog!)