Verilog基础:避免混合使用阻塞和非阻塞赋值

这篇具有很好参考价值的文章主要介绍了Verilog基础:避免混合使用阻塞和非阻塞赋值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关阅读

Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        “避免在一个always块中混杂阻塞赋值和非阻塞赋值”,这条原则是著名的Verilog专家Cliff Cummings在论文SUNG2000中提出的,这个观点在公众讨论时受到了广泛的质疑。有人认为可以在时钟沿触发的always块里把组合逻辑的阻塞赋值和时序逻辑的非阻塞逻辑安全地混杂在一起。诚然,但是这种编码风格有以下几点不足。

  1. 这种always块的事件调度理解起来比较费劲。
  2. 这种always块内的非阻塞赋值应该放在最后。
  3. 在零延迟的RTL模型中,触发器的输入信号(临时变量)和对应的触发器输出会在同一个时钟沿变化,这种波形令人困惑。

        下面来看一下段简单的代码,它拥有正确的代码风格,即没有把阻塞赋值和非阻塞赋值混杂在一起。

module test(
    output reg q,
    output y,
    input a, b, c, clk, rst_n);

    wire d;
    always@(posedge clk or negedge rst_n)
        if(!rst_n) q <= 0;
        else       q <= d;

    assign d = a & b;
    assign y = q & c;

endmodule

        以上Verilog代码的综合结果如图1所示。

Verilog基础:避免混合使用阻塞和非阻塞赋值,Verilog基础,fpga开发,数字IC,Verilog,硬件工程,前端图1 对应的综合电路 

        虽然下面的代码也正确地构建上面的电路,但是这段代码把阻塞和非阻塞赋值混杂在同一个always块中。这种编码风格经常被那些具有VHDL背景的工程师采用,因为他们为了提高VHDL仿真性能,习惯于把变量和信号赋值混杂在用一个process块中,但是在Verilog中使用这种风格并不会提高仿真性能。

module test(
    output reg q,
    output y,
    input a, b, c, clk, rst_n);

    always@(posedge clk or negedge rst_n)
        if(!rst_n) q <= 0;
        else begin:logic
            reg d;
            d = a & b;
            q <= d;
        end

assign y = q & c;

endmodule

        以上Verilog代码的综合结果如图2所示。 

Verilog基础:避免混合使用阻塞和非阻塞赋值,Verilog基础,fpga开发,数字IC,Verilog,硬件工程,前端图2 对应的综合电路 

        虽然这段代码在仿真和综合时都正确,但是最好还是不要使用这种编码风格,因为仿真波形会让人困惑。这种混杂的编码风格意味着:当与非门的输入发生变化时,组合信号d不会发生变化,组合信号d发生变化的唯一时刻是在时钟的有效沿或复位。对于大型的设计,工程师要花费很多时间去理解这种怪异的行为——触发器的输入和对应的输出在同一个沿变化,这在真实的硬件上是不会发生的,只是这种编码风格产生的副作用。

        除此之外,为了定义内部信号,需要有一个命名块(在上面为logic)。

        有的工程师说:对于上述混杂的Verilog代码,当非阻塞赋值用完内部信号后,就把它们赋值为x,这样就不会有人在波形上查看这些内部信号,也不会让人糊涂。下面就是使用这种奇怪编码风格后的代码。对于这种编码风格,内部信号在整个仿真过程中都显示成x,即使他们具有暂时的中间值。为了使用这种不好的编码风格,就制造了这么多的麻烦。

module test(
    output reg q,
    output y,
    input a, b, c, clk, rst_n);

    always@(posedge clk or negedge rst_n)
        if(!rst_n) q <= 0;
        else begin:logic
            reg d;
            d = a & b;
            q <= d;
            d <= 1'bx;
        end

assign y = q & c;

endmodule

         以上Verilog代码的综合结果如图3所示。 

Verilog基础:避免混合使用阻塞和非阻塞赋值,Verilog基础,fpga开发,数字IC,Verilog,硬件工程,前端图3 对应的综合电路 

        我们可以看到这种在同一个always块内混杂阻塞和非赋值赋值的编码风格有的缺点:仿真性能差,可读性差(需要对Verilog事件调度有很好的理解),不容易编码(可能以错误的方式混杂了两种赋值,波形令人困惑)。这种风格并没有什么明显的优点,所以Cliff Cummings坚持认为不要在同一个always块中混杂两种赋值。

 文章来源地址https://www.toymoban.com/news/detail-744614.html

到了这里,关于Verilog基础:避免混合使用阻塞和非阻塞赋值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 14.9-时序和组合的混合逻辑——使用非阻塞赋值

    原则4:在同一个always块中描述时序和组合逻辑混合电路时,用非阻塞赋值。 1,在一个always块中同时实现组合逻辑和时序逻辑 将简单的组合逻辑和时序逻辑写在一起很方便。 当把组合逻辑额时序逻辑写入到一个always块中时,应遵从时序逻辑建模的原则,使用非阻塞赋值。

    2024年02月02日
    浏览(36)
  • 避免latch verilog FPGA 基础练习2

    发现问题,用技术解决问题。兴趣是自己的源动力 ! 本文由如何避免latch的问题场景,来更详细的描述verilog中的组合逻辑电路和时序逻辑电路等等理论知识。由latch这个问题入手来阐述更多理论知识,有助于更好的理解和记忆。 Latch其实就是锁存器,是一种在异步电路系统中

    2024年02月04日
    浏览(41)
  • verilog的非阻塞赋值、延拍和电路延时

    1.时序电路使用非阻塞赋值,always块中的语句顺序无影响; 2.非阻塞赋值中d和out的新值在本次上升沿计算之后,下一次上升沿才会生效; 阻塞赋值会使信号变化立即生效 3.实际电路中,下一次上升沿值生效时会有一定触发器延时(上一拍采数时,往左边偏一点采值)。

    2024年03月24日
    浏览(38)
  • Verilog force语句详解:FPGA中的信号强制赋值

    Verilog force语句详解:FPGA中的信号强制赋值 在FPGA开发中,时序分析和调试是非常重要的一部分。其中,对于一些信号的调试,我们需要准确地模拟不同的情况来检测其工作状态。这时,Verilog force语句就起到了重要的作用。 force语句可以使信号立即进行强制赋值操作,在仿真

    2024年02月06日
    浏览(39)
  • 二、8【FPGA】Verilog中锁存器(Latch)原理、危害及避免

    学习说明此文档为本人的学习笔记,对一下资料进行总结,并添加了自己的理解。         如果拿到了数字电路技术基础的书,翻开书本的目录你会发现,关于锁存器的章节与内容非常少,也就是在触发器前面有一小节进行了简单说明。但是真的就这么简单么? 答案是否

    2024年01月16日
    浏览(47)
  • socket 的阻塞模式和非阻塞模式

    对 socket 在阻塞和非阻塞模式下的各个函数的行为差别深入的理解是掌握网络编程的基本要求之一,是重点也是难点。 阻塞和非阻塞模式下,我们常讨论的具有不同行为表现的 socket 函数一般有如下几个,见下表: connect accept send (Linux 平台上对 socket 进行操作时也包括 write 函

    2024年02月04日
    浏览(45)
  • 什么是Java中的阻塞队列和非阻塞队列?

    首先,让我们从基础概念开始。在计算机科学中,数据结构可以分为两种:队列和管道。队列是一种先进先出(FIFO)的数据结构,你可以想象成排队买电影票的情况。你加入队伍的时候,你可以决定站在哪里,但是一旦决定站在哪里,你就不能改变位置。而一旦你到达队尾,

    2024年02月14日
    浏览(45)
  • 5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

    典型的一次IO的两个阶段是什么?数据就绪和数据读写 数据就绪:根据IO操作的就绪状态 阻塞 非阻塞 数据读写:根据应用程序和内核的交互方式 同步 异步 陈硕:在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO。 一个典型的网络接口调用,分为两

    2024年02月12日
    浏览(42)
  • I.MX6ULL_Linux_驱动篇(39) 阻塞和非阻塞IO

    阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。 阻塞和非阻塞简介 这里的“IO”

    2024年02月12日
    浏览(41)
  • wpf 使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃

    wpf 使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃,示例代码如下: 使用这个方法: 请注意,BitmapImage的Freeze方法会将资源从垃圾收集器中释放,因此不会对应用程序的内存使用造成负担。不过请注意,在使用Image控件的时候,最好能及

    2024年01月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包