目录

1. always, always_comb, alwasy_ff, always_latch

2. 为什么要追加三个新的always块呢?

3.always相关的可综合设计规则

4. 几个简单的设计例


1. always, always_comb, alwasy_ff, always_latch

在旧版本的Verilog中只有一个通用的always过程块(procedural block),SV中追加了三个具有更明确目的专用always块:always_ff, always_comb, always_latch.

与原始的always块一样,这三个新的东西也是无限循环过程块—即每一个仿真周期都执行,与之相对的是initial块,在一次仿真中只执行一次。

但是与原始的always块不一样的是,三个新的always块是专门针对可综合性RTL逻辑建模而定义的,而原始always块则是万金油。事实上,always_ff, always_comb, always_latch能实现的,always都能够实现。

2. 为什么要追加三个新的always块呢?

正因为原始的always是万能的,相应地在信息表述的精确度方面就比较欠缺。也就是说真正的建模意图要根据内部具体语句才能确定,这样就留出了犯错误的空间。

新追加的三个专用块的目的就是要消除这样的模糊性,从名字上就可以一目了然地知道always_ff, always_comb, always_latch分别是用于寄存器(flip-flop,代表时序逻辑sequential logic),组合逻辑以及锁存器的建模。这样从名字就可以清楚地知道设计者的设计意图。人和各种EDA工具都可以更准确地理解代码并作出正确而相互一致的判断。

比如说,设计者本来是想设计一块组合逻辑,但是利用always进行建模时在敏感列表中遗漏了一些信号,或者内部存在不完整的if..else…或者case语句,这样综合工具就可能把它综合成锁存器。但是如果使用always_comb的话,综合工具从名字上就可以确定设计者的意图是要综合一块组合逻辑,因此针对latch式的不完整的if..else…或者case语句就会给出warning信息。

[always_comb]

always_comb用于可综合组合逻辑的建模,不需要明确地定义敏感列表。缺省地,所有出现在always_comb中所有input信号(从always_comb的外部获得赋值,出现在块内赋值语句的右边,或者条件判断语句中出现的信号,等等)都被推断属于它的敏感列表。但是内部定义的用阻塞方式进行赋值的临时变量不属于敏感列表。

always_combalways @(*)在表达组合逻辑时几乎是等价的,但是仍然存在细微的区别。有兴趣可以阅读[S.Sutherland].6.2.1的说明。在日常的设计中记住坚决地使用always_comb就可以了。

[always_ff]

always_ff用于可综合时序逻辑的建模。

必须带由posedge或者negedge所定义的敏感列表。通常就是”@(posedge clock, negedge resetN”.

always_ff块中只能使用非阻塞赋值。

[always_latch]

由于在一般的同步设计中是不允许(或至少不推荐)使用latch式设计,所以这里不作说明。在一般的设计中不用它就是了。

【寄存器 vs 锁存器】

简而言之,寄存器(通常仅指flip-flop)就是时钟沿触发的存储单元;而锁存器则指电平敏感的存储单元。前者是(因为是时钟沿触发)同步时序电路,后者因为不是由时钟沿触发而是由其它信号的电平决定其赋值,因此是异步电路。在同步时序电路设计中严禁使用latch设计。

3.always相关的可综合设计规则

【可综合设计规则】

  1. 使用always_comb进行组合逻辑建模,always_comb中使用阻塞赋值;
  2. 使用always_ff进行时序逻辑建模,always_ff中只能使用非阻塞赋值。只有非阻塞赋值才能正确描述时钟沿触发的同步逻辑行为。
  3. 同步设计中一般不允许使用latch,因此不要使用always_latch;
  4. 通用的always只用于testbench的设计;
  5. 在always_comb/always_ff/always_latch不允许使用时间和事件控制语句;
  6. 绝对不允许在同一个过程块内混合使用阻塞(=)和非阻塞(<=)两种赋值。
  7. 组合逻辑和时序逻辑尽量不要在一个过程块中描述。

4. 几个简单的设计例

Example1: 组合逻辑(阻塞赋值)和时序逻辑(非阻塞赋值)混用

always_ff @(posedge clock)
beginP =  A & B;Z <= P | C;
end

这个例子同时违反了上面两条规则(6)、(7)。当然这两规则本身是有一定相关性的:时序逻辑用非阻塞赋值;组合逻辑用阻塞赋值。理论上来说,以上语句可能能够正确并且可以综合,但是为了避免混乱以及潜在的问题,不应该用这种组合逻辑和时序逻辑混合的描述方式。有以下两种可能的改正方案:

//--solution#1
always_ff @(posedge clock)
beginZ <= (A & B) | C;
end//--solution#2
assign P = A&B;
always_ff @(posedge clock)
beginZ <= P | C;
end

Example2:

//--solution#1
always_comb
case(cur_state)
s0: beginout1 = 1’b1;
end
s1: beginout1 = in1;out2 = 1’b1;
end
s2: beginout2 = in2;
end
endcase

以上这段代码存在的问题是,对于out1/out2的赋值而言case语句是不完全的。比如说在cur_state=s0时没有对out2的明确赋值。如果是用旧版本的verilog中的always的话,综合工具就会认为这里要综合成一个锁存器(latch)。但是这里使用的是always_comb,所以综合工具能辨别出内部语句与always_comb是不一致的,因此会给出warning,但是如果设计者不理会这个warning,综合工具仍然可能会将其综合成latch。

解决这里的问题的显然办法就是补齐所有分支对输出变量的赋值。一个简单的方法是在块的开始处先对输出变量给出缺省赋值,这样接下来的分支赋值就不必完全了。如下所示:

//--solution#1
always_comb beginout1 = 1’b0;   out2 = 1’b0;
case(cur_state)
s0: beginout1 = 1’b1;
end
s1: beginout1 = in1;   out2 = 1’b1;
end
s2: beginout2 = in2;
end
endcase
end

【参考文献】

[S.Sutherland] SystemVerilog For Design(Second Edition).

SystemVerilog: always, always_comb, alwasy_ff, always_latch相关推荐

  1. SystemVerilog与功能验证

    目录 一.功能验证流程 二.验证手段.验证技术.验证方法学 三.数据类型与编程结构 四.并发进程与进程同步 五.面向对象编程 六.虚接口 七.随机测试 八.继承与多态 九.功能覆盖率 十.断言 一.功 ...

  2. SystemVerilog学习-03-设计特性与接口

    设计特性 添加接口,将通信和协议检查进一步封装. 添加类似c语言的数据类型. 添加用户自定义类型,如枚举类型.结构体类型. 添加类型转换. 添加包(package)从而使得多个设计之间可以共享公共类型 ...

  3. linux下sv高亮设置的详细教程

    前言: 学完了systemverilog和uvm书本知识,之前一直在使用Questasim进行仿真,用notepad++进行编辑代码,后面就用linux平台进行训练了,希望用起来顺手些. 本文就是为了 ...

  4. 【数字设计验证】System Verilog(sv)稍微进阶的笔记(一)

    文章目录 1. EDA工具对代码的处理与输出 1.1 Compile 1.2 Simulation 1.3 Synthesis 2. System Verilog Coding Guide 2.1 状 ...

  5. 在FSM模型中使用两态数据类型

    在FSM模型中使用两态数据类型 1.使用两态类型和枚举类型对FSM复位 在仿真刚开始时,四态数据类型的值是逻辑X.类似有限状态机这样的模型中,四态变量的X逻辑值可以用来表示模型还没有复位,或复位逻辑的 ...

  6. SV processses

    SV中的structured procedure: 1)intial procedure,keyword只有initial:最开始被调用一次: 2)always procedure,keyword包括 ...

  7. HDLBits学习记录

    四.Procedures 1.Always blocks(combinational) Since digital circuits are composed of logic gates conne ...

  8. HDLBits_第1章_Verilog Language(已完结)

    目录 1. Verilog Language 1.1 Basics 1.1.1 Simple wire 1.1.2 Four wires 1.1.3 Inverter 1.1.4 AND gate 1 ...

  9. SystemVerilog学习笔记

    SystemVerilog学习笔记(会持续更新~) 文章目录 SystemVerilog学习笔记(会持续更新~) SV数据类型 固定数组 固定数组的声明格式 一维数组与二维数组 固定数组的一些操作 固 ...

  10. SystemVerilog声明的位置

    SystemVerilog声明的位置 1.包(package) (1)包的定义 SystemVerilog的包在package和endpackage之间定义 包中可以包含的可综合的结构有 (1)par ...

最新文章

  1. linux排除多个文件,linux – 通过排除其父文件夹为多个目录创建单个tar文件
  2. 搭建WAMP 环境时,解决Windows下输入localhost找不到网页的问题
  3. 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
  4. 怎样用springboot开发cs_springboot开发之配置自定义的错误界面和错误信息
  5. java项目引入json配置,TS-28 配置tsconfig.json(3):工程引用
  6. (06)System Verilog 数组类型示例
  7. angularjs的基础知识
  8. windows server2008服务器文件上传受限制怎么办,windows server 2008 服务器上传限制
  9. Python的Lock对象和Condition对象对比
  10. win7 64位系统配置服务器,Tomcat服务器win764位配置方法
  11. Windows Server 2016忘记密码破解方法
  12. 34款Firefox渗透测试插件
  13. CryEngine 渲染流程
  14. 微信小程序,高德地图
  15. @Cacheable使用详解
  16. Dijkstra(迪杰斯特拉)模板
  17. 微软针对lapsus$事件的最新调查报告 中文版
  18. 构建虚拟web主机(基于域名,IP,端口)
  19. GGAI重磅发布《自动泊车行业发展蓝皮书》: 竞争格局生变,谁在领跑市场?
  20. DSP电机控制串行通信系统电路设计_电动机控制电路图讲解

热门文章

  1. c语言千位分隔符代码if函数,JavaScript实现千位分隔符
  2. 《动物世界》电影 观后感
  3. xsmax无法进入dfu模式_iPhoneXS/XR:强制重启,进入DFU、恢复模式
  4. 前东家欠款 1.4 亿?我看贝店爆雷事件
  5. NET Reflector——.NET反编译工具
  6. 论文中的常见缩写(w.r.t/i.e./et al等)的意思
  7. Xcode 历史版本官方下载地址 Xcode6 Xcode7
  8. 强连通分量SCC(Tarjan)
  9. 什么是SysWow64
  10. 他们都说springboot是懒人神器,你觉得呢?