testbench仿真赋值时,为符合真实情况,时序逻辑应延迟一拍

Testbench仿真时,时序逻辑无延迟存在无延迟赋值的情况

test代码:

module test_top(
    input clk,
    input rst_n,
    input a,
    input b,
    output reg c_out
    );
    always@(posedge clk)
    begin
        if(!rst_n)
            c_out<=0;
        else if(b==1)
            c_out<=a;
        else c_out<=c_out;
    end
endmodule

testbench代码:
下面展示一些 内联代码片

module top_test_tb(
    );
    reg clk;
    reg rst_n;
    reg a;
    reg b;   
    wire c_out;

    always #10 clk=~clk;
    initial begin
        clk=0;
        rst_n=1;
        a=0;
        b=0;
        #20;
        a=1;
        #30;
        b=1;
        #100;
        a=0;   
    end
       
test_top test_top(
.clk(clk),
. rst_n(rst_n),
.a(a),
.b(b),
.c_out(c_out)
    );  
endmodule

仿真波形如下:
在这里插入图片描述
可以看出赋值和判断语句在tb赋值后,无任何延迟,时序逻辑进行直接判断和赋值。与真实下载到板子中不同,时序逻辑应该在a,b值变化后的一拍,才能检测到a和b的值的变化。并进行判断和赋值。

应如何修改tb,保证正常的测试

tb文件中的与时序相关的赋值应同样采用时序逻辑。
三种方式:

//非阻塞赋值
@(posedge clk)
            a<=1;
//或
#20;
a<=1;
//将信号与时钟上升沿错开一小段
#20.1;
a=1;

testbench代码

module top_test(
    );
    reg clk;
    reg rst_n;
    reg a;
    reg b;   
    wire c_out;

    always #10 clk=~clk;
    initial begin
        clk=0;
        rst_n=1;
        a=0;
        b=0;
        #20;
        @(posedge clk)
            a<=1;
        #30;
        @(posedge clk)
            b<=1;
        #100;
        @(posedge clk)
            a<=0;   
    end
       
test_top test_top(
.clk(clk),
. rst_n(rst_n),
.a(a),
.b(b),
.c_out(c_out)
    );  
endmodule

修改后的仿真结果正常了:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值