Verilog 高级知识点

这篇具有很好参考价值的文章主要介绍了Verilog 高级知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Verilog 高级知识点

1、阻塞赋值(Blocking)

2、非阻塞赋值(Non-Blocking)

3 、assign 和 always 区别

4、什么是 latch


Verilog 高级知识点

       本节给大家介绍一些高级的知识点。高级知识点包括阻塞赋值和非阻塞赋值、assign 和 always 语句差异、什么是锁存器、状态机、模块化设计等。

1、阻塞赋值(Blocking)

       阻塞赋值,顾名思义即在一个 always 块中,后面的语句会受到前语句的影响,具体来说就是在同一个 always 中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被阻塞也就是说 always 块内的语句是一种顺序关系,这里和 C 语言很类似。符号“=”用于阻塞的赋值(如:b = a;),阻塞赋值“=”在 begin end 之间的语句是顺序执行,属于串行语句。

       在这里定义两个缩写:

  • RHS:赋值等号右边的表达式或变量可以写作 RHS 表达式或 RHS 变量;
  • LHS:赋值等号左边的表达式或变量可以写作 LHS 表达式或 LHS 变量;

       阻塞赋值的执行可以认为是只有一个步骤的操作,即计算 RHS 的值并更新 LHS,此时不允许任何其他语句的干扰,所谓的阻塞的概念就是值在同一个 always 块中,其后面的赋值语句从概念上来讲是在前面一条语句赋值完成后才执行的。

       为了方便大家理解阻塞赋值的概念以及阻塞赋值和非阻塞赋值的区别,我们这里以在时序逻辑下使用阻塞赋值为例来实现这样一个功能:在复位的时候,a=1b=2c=3;而在没有复位的时候,a 的值清零,同时将 a 的值赋值给 bb 的值赋值给 c,代码以及信号波形图如下图所示:

Verilog 高级知识点

        代码中使用的是阻塞赋值语句,从波形图中可以看到,在复位的时候(rst_n=0),a=1b=2c=3;而结束复位之后(波形图中的 0 时刻),当 clk 的上升沿到来时(波形图中的 2 时刻),a=0b=0c=0。这是因为阻塞赋值是在当前语句执行完成之后,才会执行后面的赋值语句,因此首先执行的是 a=0,赋值完成后将 a 的值赋值给 b,由于此时 a 的值已经为 0,所以 b=a=0,最后执行的是将 b 的值赋值给 c,而 b 的值已经赋值为 0,所以 c 的值同样等于 0

2、非阻塞赋值(Non-Blocking)

       符号“<=”用于非阻塞赋值(如:b <= a;),非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将 begin-end 之间的所有赋值语句同时赋值到赋值语句的左边,注意:是 begin—end 之间的所有语句,一起执行,且一个时钟只执行一次,属于并行执行语句。这个是和 C 语言最大的一个差异点,大家要逐步理解并行执行的概念。

       非阻塞赋值的操作过程可以看作两个步骤:

  • 1)赋值开始的时候,计算 RHS
  • (2)赋值结束的时候,更新 LHS

       所谓的非阻塞的概念是指,在计算非阻塞赋值的 RHS 以及 LHS 期间,允许其它的非阻塞赋值语句同时计算 RHS 和更新 LHS

       我们下面使用非阻塞赋值同样来实现这样一个功能:在复位的时候,a=1b=2c=3;而在没有复位的时候,a 的值清零,同时将 a 的值赋值给 bb 的值赋值给 c,代码以及信号波形图如下图所示:

Verilog 高级知识点

        代码中使用的是非阻塞赋值语句,从波形图中可以看到,在复位的时候(rst_n=0),a=1b=2c=3;而结束复位之后(波形图中的 0 时刻),当 clk 的上升沿到来时(波形图中的 2 时刻),a=0b=1c=2。这是因为非阻塞赋值在计算 RHS 和更新 LHS 期间,允许其它的非阻塞赋值语句同时计算 RHS 和更新 LHS。在波形图中的 2 时刻,RHS 的表达是 0ab,分别等于 012,这三条语句是同时更新 LHS,所以 a、b、c 的值分别等于 012

       在了解了阻塞赋值和非阻塞赋值的区别之后,有些朋友可能还是对什么时候使用阻塞赋值,什么时候使用非阻塞赋值有些疑惑,在这里给大家总结如下。

       在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句,这种电路结构只与输入电平的变化有关系,代码如下:

Verilog 高级知识点

       在描述时序逻辑的时候,使用非阻塞赋值,综合成时序逻辑的电路结构,比如带时钟的 always 语句;这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化,代码如下:

always @(posedge sys_clk or negedge sys_rst_n) begin 
     if (!sys_rst_n) begin 
          a <= 1'b0; 
          b <= 1'b0; 
     end 
     else begin
          a <= c; 
          b <= d; 
     end 
end

3 、assign 和 always 区别

       assign 语句和 always 语句是 Verilog 中的两个基本语句,这两个都是经常使用的语句。

       assign 语句使用时不能带时钟。

       always 语句可以带时钟,也可以不带时钟。在 always 不带时钟时,逻辑功能和 assign 完全一致,都是只产生组合逻辑。比较简单的组合逻辑推荐使用 assign 语句,比较复杂的组合逻辑推荐使用 always 语句。

示例如下:

assign counter_en = (counter == (COUNT_MAX - 1'b1)) ? 1'b1 : 1'b0; 
always @(*) begin
     case (led_ctrl_cnt) 
         2'd0 : led = 4'b0001;
         2'd1 : led = 4'b0010;
         2'd2 : led = 4'b0100;
         2'd3 : led = 4'b1000;
         default : led = 4'b0000;
     endcase
end

带时钟和不带时钟的 always

        always 语句可以带时钟,也可以不带时钟。在 always 不带时钟时,逻辑功能和 assign 完全一致,虽然产生的信号定义还是 reg 类型,但是该语句产生的还是组合逻辑。

reg [3:0] led;
always @(*) begin
      case (led_ctrl_cnt) 
           2'd0 : led = 4'b0001;
           2'd1 : led = 4'b0010;
           2'd2 : led = 4'b0100;
           2'd3 : led = 4'b1000;
           default : led = 4'b0000;
      endcase
end

       在 always 带时钟信号时,这个逻辑语句才能产生真正的寄存器,如下示例 counter 就是真正的寄存器。

//用于产生 0.5 秒使能信号的计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
      if (sys_rst_n == 1'b0)
           counter <= 1'b0;
      else if (counter_en)
           counter <= 1'b0;
      else
           counter <= counter + 1'b1;
end

Verilog 高级知识点

4、什么是 latch

       latch 是指锁存器,是一种对脉冲电平敏感的存储单元电路。锁存器和寄存器都是基本存储单元,锁存器是电平触发的存储器,寄存器是边沿触发的存储器。两者的基本功能是一样的,都可以存储数据。锁存器是组合逻辑产生的,而寄存器是在时序电路中使用,由时钟触发产生的。

       latch 的主要危害是会产生毛刺(glitch),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强,不易查出。因此,在设计中,应尽量避免 latch 的使用。

       代码里面出现 latch 的两个原因是在组合逻辑中,if 或者 case 语句不完整的描述,比如 if 缺少 else 分支,case 缺少 default 分支,导致代码在综合过程中出现了 latch解决办法就是 if 必须带 else 分支,case 必须带default 分支。

      大家需要注意下,只有不带时钟的 always 语句 if 或者 case 语句不完整才会产生 latch,带时钟的语句 if 或者 case 语句不完整描述不会产生 latch。

      下面为缺少 else 分支的带时钟的 always 语句和不带时钟的 always 语句,通过实际产生的电路图可以看到第二个是有一个 latch 的,第一个仍然是普通的带有时钟的寄存器。文章来源地址https://www.toymoban.com/news/detail-484697.html

Verilog 高级知识点

到了这里,关于Verilog 高级知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA学习笔记-知识点3-Verilog语法1

    按其功能可分为以下几类: 1) 算术运算符(+,-,×,/,%) 2) 赋值运算符(=,=) 3) 关系运算符(,,=,=) 4) 逻辑运算符(,||,!) 5) 条件运算符( ? :) 6) 位运算符(,|,^,,^) 7) 移位运算符(,) 8) 拼接运算符({ }) 9) 其它 按其所带操作数的个数运算符可分为三种: 1) 单目运算符(unary operator):可以带一个

    2024年02月06日
    浏览(46)
  • 数据库相关理论知识(有目录便于直接锁定相关知识点+期末复习)

    一,数据模型,关系型数据模型,网状模型,层次模型 1. 数据库模型 是用来描述和表示现实世界中的事物、概念以及它们之间的关系的工具, 但是并不是越专业越好,还要平衡它的模型的复杂性、通用性和成本效益等因素 。数据模型按不同的应用层次可以分为 三个层次 ,

    2024年03月16日
    浏览(42)
  • [SVA知识点一]: System verilog 断言(assert)的基本介绍

    断言(System Verilog Assertion 简称SVA) 可以被放在RTL设计或验证平台中,方便在仿真时查看异常情况。一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于30%。断言通常被称为序列监视器或者序列检验器,是对设计应当如何执行特定行为的描述,是一种嵌入设

    2024年02月10日
    浏览(32)
  • [SVA知识点二]: System verilog 断言(assert)的基本介绍

    举例介绍序列: 例1 序列seq1检查信号 “b” 在每个时钟上升沿都为高电平。如果信号 “b” 在任何一个时钟上升沿不为高电平,断言将失败。这相当于 “b == 1’b1”。 例2 例3:带参数的sequence 例4:带时序关系的sequence,在SVA 中时钟延时用符号 “##” 来表示,如 “##2” 表示

    2024年02月02日
    浏览(30)
  • Flutter 空安全的糖果罐,带你全面掌握高级知识点

    -h, --[no-]help 显示帮助信息 -p, --path Flutter 项目的根路径 (默认 “.”) -f, --folder assets 文件夹的名字 (默认 “assets”) -w, --[no-]watch 是否继续监听 assets 的变化 (默认 开启) -t, --type pubsepec.yaml 生成配置的类型 “d” 代表以文件夹方式生成 “- assets/images/” “f” 代表以文件方式生成

    2024年04月15日
    浏览(33)
  • 深度解析Redisson框架的分布式锁运行原理与高级知识点

    分布式系统中的锁管理一直是一个复杂而关键的问 题。在这个领域,Redisson框架凭借其出色的性能和功能成为了开发者的首选之一。本篇博客将深入探讨Redisson框架的分布式锁运行原理以及涉及的高级知识点。通过详细的解释和示例代码,您将更好地理解如何在分布式环境中

    2024年02月09日
    浏览(34)
  • c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

    总结:视频中对于多线程讲的非常透彻,从线程基础概念—.net不同版本出现的线程方法—多线程常出现问题—双色球项目实践,每个知识点都有代码实操,受益匪浅。附上学习笔记和实操代码。 视频 线程:程序执行的最小单位,任何操作都是由线程完成的,使用同步时,资

    2024年02月11日
    浏览(39)
  • 【PPT】《使用ChatGPT一键制作带自动配图的PPT演讲稿》- 知识点目录

    为了制作《汽车诞生史》PPT,您可以考虑以下提示: 开场:引用一句关于汽车的名言或警句,如“汽车是现代生活的象征”,“车祸并非事故,而是可以避免的错误”。 起源:介绍汽车的起源和早期发展历史,包括发明汽车的重要人物和他们的贡献。 技术进步:介绍汽车技

    2023年04月09日
    浏览(66)
  • 轻松掌握K8S目录持久卷PV/PVC的kubectl操作知识点04

    1、介绍 在docker中可以将容器中的目录挂载出来,在k8s中pod可以部署在不同节点,假如该节点的机器宕机了,k8s可能就会将此Pod转移到其他机器,就不是原先的机器了。k8s有自己的一套挂载方案,如下图所示, 原理为将所有节点的挂载的目录统一抽象管理为叫做 存储层的概念

    2024年02月12日
    浏览(35)
  • 【SciSpace】人工智能太强大了!文献阅读版ChatGPT,一站式科研文献阅读工具 - 知识点目录

    首先需要上传PDF 网站支持中文问答 Explain math table - 可以询问表格或者公式信息

    2024年02月16日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包