2021.7.4
继续HDLbits,今天procedures能做多少做多少。
(28)其实逻辑门和连线的结合就能表示所有数字电路了,但是有了procedures(过程块)之后就可以缩短描述数字电路的时间成本了。
①过程块内部语法和外部是不一样的,其内部会有更加丰富的关键字和语句集。
②在内部模块当中一般不允许连续赋值,可以存在的一般都被放在initial语句当中作为不可综合的成分。
③过程块外部是和其他语句一起并行执行的,而过程块内部是串行执行的。
④对于组合always块,敏感变量列表总是使用(*)。如果把所有的输入都列出来也是可以的,但容易出错的(可能少列出了一个),并且在硬件综合时会忽略您少列了一个,仍按原电路综合。 但仿真器将会按少列一个来仿真,这导致了仿真与硬件不匹配。(在SystemVerilog中,使用always_comb)
//以上这段话我是不理解的
⑤不同于assign语句,过程赋值(always过程块中)的左侧必须是reg类型(变量类型)。这个区别和最终综合的硬件没有关系,没什么差。
(29)用always过程块来描述时序逻辑。存在一个敏感条件(如时钟上升/下降沿)。该过程块在综合时在组合逻辑的输出生成了一组触发器(或寄存器),然后等到满足了敏感条件就可以看到触发器(或寄存器)后面的输出。
总结一下,Verilog中有三种赋值方法:
①连续赋值。//assign x = y;
②过程赋值(阻塞赋值)//x = y;
③过程赋值(非阻塞赋值)//x <= y;
④在组合always语句块中,使用阻塞赋值,在时序always块中,用非阻塞赋值。
(30)在always块里面实现if-else条件语句,条件语句会被综合成MUX。
//用连续赋值也能综合MUX,除了直接使用最小项之和的形式之外,还可以用:
assign out = (condition) ? x : y;
(31)这道题主要讲的是如何避免在综合的时候出现锁存器。
语法正确的代码不一定能综合成我想要的电路,如果在条件语句中没有把所有的可能写出来,Verilog会把剩余的可能的输出保持不变(综合出锁存器)。而锁存器不好,所以不能让以上情况发生。
本题就是把if-else语句中缺的可能性补全了。