文章目录

  • 前言
  • 一、Verilog always与Systemverilog always_comb、always_latch、always_ff对比
  • 二、零时刻自动求值
    • 1、 always_comb 与 always不同
    • 2.always_comb 和 always@*的比较
  • 总结

前言

 这一篇文章主要比较Verilog always块与Systemverilog 中的always_comb、always_ff、always_latch块的区别。


一、Verilog always与Systemverilog always_comb、always_latch、always_ff对比

 1、Verilog中使用always过程块表示锁存逻辑和组合逻辑的区别:
 always表示锁存逻辑的情况:
 过程块中赋值的变量至少有一个不能被某些输入条件更新。
 always表示组合逻辑的情况:
 所有在过程块中赋值的变量必须随所有可能的输入组合变量而更新。(if else 要完整)  因为Verilog的always过程块是通用的,因此不能强制其他软件工具也采用这些综合原则,比如,仿真工具必须允许always 过程块能够灵活地使用,不必遵循综合编译器的使用方式,因为always过程块的仿真和综合不依照同样的语法规则,所以如果设计者没有遵循严格的、自我约束的建模规则的情况下,自然会发生仿真和综合结果不一致的情况,形式验证工具也可能会要求设计遵循自我约束的建模规则来避免仿真结果和形式验证结果的不一致。
 Systemverilog 新加入了3个特有的过程块,用来减少通用always过程块建模硬件时的不确定性,它们是always_comb、always_ff、always_latch。
 Verilog和Systemverilog 关于锁存器建模的区别

Verilog
always @(a,en)if(en) y=a;
Systemverilog
always_combif(en) y=a;

 分析:
 从always_comb这个关键字出发,软件工具就能够明确设计者想要对组合逻辑建模,并且给出一个警告信息,指出在硬件实现该功能块时会产生一个锁存器。
 在上面的例子中,如果想得到组合逻辑,正确的描述应该包括一个else分支,这样输出y就能够在en的条件下更新。

二、零时刻自动求值

1、 always_comb 与 always不同

 always_comb过程块与always过程块的另一个不同之处在于,在所有initial和always过程块启动后,always_comb块会在仿真的零时刻自动触发,不管推断出的敏感表中的信号是否发生了变化,这样的自动求值都会发生。always_comb的这种特殊的语义确保了组合逻辑在零时刻产生与输入相对应的输出结果,特别是在使用缺省值为逻辑0的两态变量建模时,这种零时刻的自由自动求值尤为重要,复位信号很可能不会引起组合逻辑的敏感表中的信号发生变化,而如果没有变化,通用always过程块不会被触发,从而使输出变量也不会变化。
 代码如下:

module controller(output logic read,write,input instr_t instruction,input logic clk,resetN);
enum {WAITE,LOAD,STORE} State,NextState;always @(posedge clk or negedge resetN)if(!resetN)State <= WAITE;elseState  <= NextState;//always_comb
always @(State) begincase (State)WAITE: NextState=LOAD;LOAD:  NextState=STORE;STORE: NextState=WAITE;endcaseend
always @(State,instruction) beginread=0;write=0;    //初始值 防止生成锁存器if(State==LOAD && instruction ==FETCH)read=1;else if(State==STORE && instruction == WRITE) write=1;
end
endmodule由于read=0,write=0,所以即时if没有else的分支,
也不会有锁存器生成。

 这个仿真会有一个微秒的结果,在仿真的零时刻,枚举类型变量默认为枚举类型基类的缺省值。除非显式声明,否则基类为两态int类型,仿真开始时int的初始值为0,这也是枚举值列表中WAITE的值。因此,变量State和NextState的缺省值都为WAITE,在clk的上升沿,状态时序逻辑会将NextState的值赋给State,由于两个变量的值是一样的,所以赋值后State的值实际上并没有变化,而正因为State没有发生变化,也就不会触发always@(State)过程块,导致变量NextState的值不断更新,这样变量State和NextState的值始终相同,导致此模型的仿真结果锁定。
 使用always_comb

module controller(output logic read,write,input instr_t instruction,input logic clk,resetN);
enum {WAITE,LOAD,STORE} State,NextState;always @(posedge clk or negedge resetN)if(!resetN)State <= WAITE;elseState  <= NextState;//always_comb
always_comb  begincase (State)WAITE: NextState=LOAD;LOAD:  NextState=STORE;STORE: NextState=WAITE;endcaseend
always @(State,instruction) beginread=0;write=0;    //初始值 防止生成锁存器if(State==LOAD && instruction ==FETCH)read=1;else if(State==STORE && instruction == WRITE) write=1;
end
endmodule

 当所有过程块启动之后,always_comb过程块会在仿真零时刻自动执行一次,也就是说在仿真零时刻,这个例子中的变量NextState会更新为与变量State值相对应的新值。当第一个时钟上升沿来临之后,State的值变为NextState的值,这个值与原来的State值不同的,这种变化会触发always_comb过程块,然后更新NextState值对应新的State的值。

2.always_comb 和 always@*的比较

 与always相比always_comb敏感列表包含函数的读取信号。

always_comb过程块会对data、sel、c、d和e敏感always @* begina1 = data << 1;b1 = decode();
end//推断出@(data)always_comb begina2 = data << 1;b2 = decode();
end//推断出@(data,sel,c,d,e)function decode; //不带输入的函数begincase(sel)2'b01: decode = d| e;2'b10: decode = d & e;
default: decode = c;endcaseendendfunction

总结

 always与always_comb最大的区别在于,是否是零时刻触发,上面的代码例子很形象地说明由于always不会在零时刻自动触发,所以产生了死锁。

Systemverilog always_comb 过程块相关推荐

  1. 硬件描述语言(HDL)基础——过程块

    第1关:持续赋值与过程块 任务描述 本关任务:采用持续赋值语句assign和过程块完成与门的建模. 知识点 为了完成本关任务,需要掌握的知识点如下: 基于持续赋值语句的建模 基于持续赋值语句的建模是指 ...

  2. 【Verilog 语法】~ if-else、case、for、generate、函数 function、任务 task、过程块、位宽计算、阻塞/非阻塞、时间尺度、存储器设计、

    文章目录 1. if-else 1.1 设计要点 2. case 2.1 概述 2.2 语法 2.3 注意事项 3. for 3.1 区别与其它语言的for循环 3.2 注意事项 4. generat ...

  3. Verilog:【3】边沿检测器(edge_detect.sv)

    碎碎念: 学习新知识的感觉还是比较快乐,下面要介绍的是一个全能的边沿检测器,可以识别上升.下降.以及同时检测两种边沿,不得不说人家的代码写得确实很优雅. 目录 1 模块功能 2 模块代码 3 模块思路 ...

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

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

  5. SystemVerilog与功能验证

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

  6. HDLBits: 在线学习 SystemVerilog(五)-Problem 19-23

    HDLBits: 在线学习 SystemVerilog(五)-Problem 19-23 HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (H ...

  7. SystemVerilog学习笔记

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

  8. [笔记] systemverilog学习笔录

    2015-08-20 周四 晴 http://blog.chinaaet.com/detail/40060 SystemVerilog中包含并发断言和即时断言两种类型的断言.所谓并发断言就是在时钟边沿 ...

  9. [SV]SystemVerilog学习笔记之struct union

    SystemVerilog学习笔记(四) 一.结构体(struct) 1.1.结构体声明(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct { // 通过var进行 ...

  10. SystemVerilog中的Program的学习笔记

    1.SystemVerilog中的Program的作用? 将验证部分与设计部分进行隔离(实现方式就是将软件验证部分放置program中) 2.SystemVerilog中的Program结束方式? P ...

最新文章

  1. Top 10 Mistakes Java Developers Make(转)
  2. 原创 | 浅议个人数据开发利用新范式
  3. HeadFirst设计模式篇十:状态模式
  4. python装饰器类-PYTHON里的装饰器能装饰类吗
  5. 如何捕获window.print点击打印或取消_原来1:1的CAD图纸要这样打印!学了这么久才知道...
  6. PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试
  7. ASP.NET MVC5 之 分部页
  8. mysql 日期计算,今天,明天,本周,下周,本月,下月
  9. android——GestureDetector.OnGestureListener 手势详解
  10. gre作文3.5什么水平计算机专业,gre作文3.5分如何达到
  11. 电脑调分辨率黑屏了怎么办_调显示器分辨率黑屏怎么办
  12. 谷歌浏览器Chrome通过命令截图整个网页,screen,通过插件生成gif图片,以及通过插件进行录屏
  13. Kafka offset 偏移量详解
  14. 阿里云docker安装nginx和tomcat
  15. 用友U8+ V16.0 V15.1 V15.0 V13.0 V12.5 12.1 12.0 11.1 11.0注册
  16. 微信页面在电脑上调试
  17. 程序员都秃顶?Python 创始人笑了,养生还得学这门语言
  18. py sel采集部署linux报错
  19. Android 自有App内部跳转到微信小程序的方法
  20. Python五分钟教你制作一个太阳

热门文章

  1. 专利与论文-1:为什么要写专利?专利有什么好处?
  2. 小米9SE CC9小米8小米6X小米mix2s红米note7Pro小米9红米note8Pro 红米note8等移除ID 解账户锁教程
  3. WiFi探针获取的伪MAC地址是什么?
  4. RobotStudio安装教程
  5. Chrome 屏蔽广告
  6. 正则表达式-re.error: unbalanced parenthesis at position 7
  7. Android 自定义控件浅谈
  8. Python的列表解析式,集合解析式,字典解析式
  9. tkinter中控件menu的两种组织方法
  10. HDLC和PPP协议总结