关于verilog testbench

写了个spi module,怎么测都不过,没办法,回头来做行为仿真。

学习写testbench使用的是下面的文档,来自某FPGA制造商文档:

 /Files/pied/verilog_testbench_primer.pdf

区别与verilog HDL代码,主要留意以下内容:

1,语言本身支持的特征和可综合的代码是两回事,不是所有verilog语言都可以转化为硬件的。 

2,testbench作为top module,不需要任何输入和输出。

3,在testbench module中将要测试的模块例化为dut(名字可以任起),input要是reg类型,output要是wire类型,inout是reg。

4,initial和always是同时执行的,只是initial只执行一次。

5,通过在initial里面添加语句,对 dut进行各种输入设置,以达到测试dut的目的。

6,必要时在测试的module,或者是testbench的代码中添加$display($time,"<value of BufferPort :%h>", BufferPort); 来查看变量值。 

 

下面是给俺的SPI module写的testbench,参考上面的pdf写的:

复制代码
module controller();

reg    rst_l;
reg    clk_100;
reg    sdi;
reg    sck;
reg    cs;
reg    TransFlag;
reg    [0:7] trsData;

wire    [0:7] rcvData;
wire    TransEndFlag;
wire    ReceiveFlag;
wire    sdo;

reg    [4:0] i;
reg     [4:0] counter;


spi    dut(    .rst(rst_l),
        .clk(clk_100),
        .sdi(sdi),
        .sdo(sdo),
        .sck(sck),
        .cs(cs),
        .trsData(trsData),
        .rcvData(rcvData),
        .TransFlag(TransFlag),
        .TransEndFlag(TransEndFlag),
        .ReceiveFlag(ReceiveFlag)
    );


//test 'read'&'read' from reg 0x0000 of ad9865

always    #5    clk_100 = ~clk_100;

initial    begin
    $display($time"It's my first test bench!");
    clk_100 = 1'b0;
    counter = 3'b000;

$display($time"coming out of reset!");

//initiate spi input
    sck = 1'b0;
    cs = 1'b1;
    sdi = 1'b0;

    rst_l = 1'b0;
    #20 rst_l = 1'b1;
    
//send parametes set
    TransFlag = 1'b1;
    trsData = 8'b0101_0101;
    
//begin send test
    cs =1'b0;
    wait (TransEndFlag == 1'b1);
    $display($time,"send processing is finished!");
    TransFlag = 1'b0;
    cs =1'b1;
//begin receive test    
    cs = 1'b0;
    for (i =8; i != 0; i=i-1) sdi = 1;
    wait (ReceiveFlag == 1'b1);
    cs = 1;
    $display($time,"the data received :%h", rcvData);    
    end

always @(posedge clk_100) begin
    if(sdo == 1)
        $display($time,"posedge_ of sdo comes :%h", sdo);
    if(counter ==11)begin
        sck =~sck;
        counter = 3'b000;
        end
    else begin
        counter = counter +1'b1;
        end
    end
endmodule 
复制代码


再三检查SPI的逻辑,最后发现,我给的sck是clk的十分之一,而SPI module里面用的给端口采样的频率也是clk的十分之一,所以老是采样不成功;把sck改更小后问题解决。 

posted @   Biiigfish  阅读(7098)  评论(1编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示