野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 271|回复: 2

[xilinx] 请教仿真问题,是阻塞还是非阻塞

[复制链接]
发表于 2023-11-30 11:33:52 | 显示全部楼层 |阅读模式
Verilog 编写tb文件时,需要生成时钟信号,这时教程视频里面给出的是:


always #10 sys_clk = ~sys_clk;

使用了阻塞赋值,我看到有个弹幕说这里一一定要用阻塞赋值,但是always一般不是非阻塞赋值吗,这里是例外吗,为什么这样做呢?
我又去看了正点的教程,那边是非阻塞赋值



always #10 sys_clk <= ~sys_clk;




我按照正点非阻塞生成时钟,编写寄存器进行仿真,就会出现 不延迟一拍 的现象:


    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            a_delay <= 1'b0;
        else
            a_delay <= a_module;
        end

如果写这样的代码,a_delay 不会延迟a_module 一拍,会直接跟随a_module变化


然后我看正点的例程,他直接取巧,让输入信号全部不在时钟上升沿变化来避免这个问题:

initial begin
        sys_clk = 1'b1;
        sys_rst_n <= 1'b0;
        a <= 1'b0;
        #201
        sys_rst_n <= 1'b1;
        #20
        a <= 1'b1;
        #100
        a <= 1'b0;
        end

延迟201ns,让信号刚好不在时钟上升沿变化,这就很难绷

所以到底应该怎么编写tb文件呢,应该非阻塞生成时钟,还是阻塞生成时钟。

如果能告诉我为什么就好了,感谢帮助!



回复

使用道具 举报

发表于 2023-12-2 16:29:58 | 显示全部楼层
在 Testbench 中对赋值号不是很强制的要求, 使用“=” 和“<=”赋值均可, 都能够仿真出来结果, 且最后不会被综合成实际的电路, 不会影响其功能
回复 支持 反对

使用道具 举报

发表于 2023-12-2 16:38:23 | 显示全部楼层
推荐在写 Testbench 的时候时钟用“=” 赋值, 输入信号用“<=” 赋值、可以避免你说的不延迟一拍的现象,有时候仿真时钟用的是“<=” 赋值会出现这种问题 。但是对其实际电路没有影响,仿真在对时钟赋初值时建议赋高电平, 方便数据的变化都是在时钟的上升沿进行,和我们的 RTL 代码更接近。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 01:55 , Processed in 0.115735 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表