数字逻辑与数字系统笔记-第七讲 - 雨中的博客

记录翀翀🥺学习数字逻辑与数字系统的核心笔记与思考,由于这门课程和计算机系统基础的知识点联系性较强,可以作为408机组原理的补充学习。这里分享一段话:要么出众,要么出局,乾坤未定,你我皆是黑马,同是寒窗苦读,怎愿甘拜下风。

基于过程块的建模

阻塞赋值

在之前一讲的最后我们学习到了基于过程块的建模中的过程赋值语句,在SystemVerilog中,过程赋值语句可以分为两类:阻塞赋值(=)和非阻塞赋值(<=),其格式如下面所示。其中延迟量意义不变,也是不可以综合的。阻塞语句用来描述组合逻辑电路,非阻塞赋值用于描述时序逻辑电路。

1
2
#5 out =a&b;//阻塞赋值
out[3:0]<={b[2:0],1'b1};//非阻塞赋值

阻塞语句在该语句结束后就会立即完成赋值操作,如果在一个过程块有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的赋值语句就不能执行,仿佛被阻塞了一般、由此可以,阻塞赋值中输入的变化会立即影响输出,故用于描述组合逻辑电路。

思考:阻塞语句貌似是串行的,这和SystemVerilog的并行性不冲突吗?

不冲突,两者强调的方面不一样。并行性是指语句的执行之前没有串行机制,因此假设

1
2
logic a=5;
logic b=7;

那么两个指令是并行执行的,没有变量的先后创建之分,这是并行性,他值得是语句的执行没有串行机制。但是对于一个变化来说,一定是前面的先变化,然后后面的赋值语句再接收到前面的变化后,在执行这个变化,因为对于后面的语句来说变化在未传达之前是不可预知的,因此必须先等待前面的赋值语句做出改变。

思考:阻塞语句和非阻塞语句的区别?

其实就是组合逻辑电路与时序逻辑电路的区别。我们前面学习了时序逻辑电路并不是接收到变化后立刻发生改变,而是需要等待所有的条件全部具备以后在发生变化,因此非阻塞语句就是等待全部变化赋值以后才可以执行。而阻塞语句就是接收到改变立刻修改赋值的语句,只能用于逻辑组合电路。

很明显上面额y想要变化,首先需要a和b更新赋值才可以。这就是逻辑上的串行,但是同时这几条指令是同时执行的,即a和b时同时发生变化的,因此是并行的,当y接收到a和b的变化后会立刻发生改变。

分支结构

在SystemVerilog中,分支结构有if…else语句和case语句。If…else语句是可综合的,主要用于生成多路选择器,其格式如下。if…else语句支持多层嵌套,可以使用begin…end增加可读性(类似于大括号)。

一定要注意在SystemVerilog中使用if…case语句尽量要考虑所有的条件(完整分支),即所有的情况都进行处理,这样才能产生组合逻辑电路,否则将综合出带有锁存器的时序电路。

也就是说即使某些情况我们不需要进行任何操作,最好也要加以讨论,如:

我们发现水位最高位14m,而我们使用的是4位表示,那么最高可以表示15,即使15的时候什么等也不亮,我们最好也加上一个灭灯的操作使得讨论完整。即总是要加上一个else总是好的。不要像写oj题一样只写if不写else。

同样的case语句也是一种分支结构语句,也是可以综合的,他主要用于生成多路选择器、译码器等。格式如下,同样的,对于case尽量也要考虑全面,这样才能产生组合逻辑电路,否则,将综合出带有锁存器的时序电路。也就是说,最后要加上default使得讨论完整。

并且某个分支项item_expr中的某位无关值,用?表示,那么该位的比较就不予考虑,即意味着比较结过永远为“真”。如下图:

下面我们来看一下如果未讨论完整所有的情况,那么综合时就会出现锁存器。

对于上面将2位的4中情况全部都讨论了,那么没事正常运行。如果出现下面这种少讨论的情况,那么就会出现锁存器,实际上锁存器很好理解。EN是使能端,只有EN为1时,输出端才会随着输入端立刻变化,即如果是a,b,c的某一种情况,那么Dout也会瞬间会根据不同的情况输出相对应的值,但是如果是未讨论的d情况出现了,那么此时EN会变为0,但是此时他和三态缓冲器不同,他的输出端并不是变为浮空,而是被锁住一直维持最后一次的输出状态,即如果在d情况之前Dout一直输出的是a的输出信号,那么锁住以后就一直维持输出a情况的输出信号直至d情况结束。如果d情况之前Dout一直输出的是c的输出信号,那么此时就会一直维持c情况的输出。

循环结构

在SystemVerilog中,循环结构主要包括for、repeat、while和forever。

  • for:满足条件表达式时执行(和C一样)
  • repeat:直接循环预先给定的次数
  • while():满足条件时执行
  • forever:一直循环下去

在这4种循环语句中,for语句是可综合的,可以用于数字电路的建模,其他三种语句多用于仿真当中,不一定能被综合工具支持。

注意这里的循环变量i等一定要设置为int或者其他的二态变量型,而不要使用logic向量型,否则会造成死循环。

行为建模总结

在行为建模中我们分别学习了基于持续赋值语句的建模和行为建模两个不同风格的建模。这里做一个总结:

  • 基于持续赋值语句的建模只能用于描述组合逻辑电路
  • 在过程块中,过程赋值“=”左边的信号必须是变量类型,不能是线网类型,而对右边的表达式则没有任何限制。
  • 基于过程块的组合逻辑电路建模可以通过always_comb和阻塞赋值语句完成
  • 基于过程块的组合逻辑电路,使用if..else和case…语句时要特别注意需要列出所有可能的条件,否则,综合得到的将不是组合逻辑电路。(对于case,必要时不忘记default语句)
  • 基于持续赋值语句的建模方式和基于过程块的建模方式在一个模块设计中可以混用,并且没有顺序关系。



©2020 - 2021 By wenchong
津ICP备2021009044号

本站总访问量为 访客数为

本站使用 Volantis 作为主题|借助hexo强力驱动|由腾讯云提供云服务