Verilog testbench - 使用任务来驱动包含文件中的信号?

时间:2016-12-22 18:56:46

标签: verilog simulation fpga

我正在模拟使用FPGA和CPU的设计。 CPU通过SPI与FPGA通信,FPGA根据传输的数据控制一些输出。

我已经启动并运行了模拟,我的模拟CPU测试平台可以通过SPI读写FPGA寄存器。现在我想重构我的代码,使它更清洁一点。

我在顶层测试平台中通过SPI发送了几个通过SPI发送数据的任务,名为 tb_system_interface.v ,其中包含由testbench实例化的tb_system_interface模块。最低级别的任务称为 spi_send_byte ,它将数据发送到MOSI线路,在MISO线路上接收并驱动SCLK。其他更高级别的任务在FPGA上读写寄存器来控制输出(例如设置PWM值,设置输出值等)

我尝试将SPI事务重构为一个名为 tb_sim_spi_tasks.v 的新文件。我将此文件包含在tb_system.v文件中。当然,现在我的 spi_send_byte 任务不起作用,因为它不再位于其中包含SPI信号的模块内。

有没有办法做我想做的事情?是否可以跨多个文件传播模块定义?或者某种全局变量,该任务可以设置由我的测试平台输出?

1 个答案:

答案 0 :(得分:0)

我发现了如何做到这一点,我从错误的位置包含了该文件。而不是顶部的所有包含,包含需要在模块内。 以下是原始代码:

`timescale 1ns/100ps
`include "ch_defines.v"
`include "tb_sim_spi_tasks.v"

module tb_system_interface(
    output reg SYSTEM_EXTERNAL_RESET_N, 
    output reg SYSTEM_CLOCK, 

    output reg system_sclk, 
    output reg system_mosi,
    output reg system_cs_n,
    input wire system_miso,


    input wire sys_ok // Flag that CCC is locked

);
parameter SYSCLK_PERIOD = 10; // 10ns period = 100MHz.  

这就是修复:

`timescale 1ns/100ps
`include "ch_defines.v"

module tb_system_interface(
    output reg SYSTEM_EXTERNAL_RESET_N, 
    output reg SYSTEM_CLOCK, 

    output reg system_sclk, 
    output reg system_mosi,
    output reg system_cs_n,
    input wire system_miso,


    input wire sys_ok // Flag that CCC is locked

);

`include "tb_sim_spi_tasks.v"

parameter SYSCLK_PERIOD = 10; // 10ns period = 100MHz.