Verilog描述下的初始化问题

来源:互联网 发布:htc软件下载 编辑:程序博客网 时间:2024/05/21 15:02

最近在百度知道里见过两个问题,如下:

问题1:
module outer(q,c0,c1,led1,led0);  input q;       output c0,c1,led1,led0;    reg c0,c1;      wire led1,led0;  always@(q)  begin    c0<=~c0;    c1<=c0^c1;  end  assign led0=c0;  assign led1=c1;endmodule这是我的代码,为什么加波形的时候说没有q这个信号呢?仿真的时候也说输入管脚q被忽略了
问题2:

module sa(a,b,mu,shiftb,start);input [3:0] a,b;input start;output reg[7:0] mu,shiftb;integer i;always @(a or b)   begin       if(start==1)      beginshiftb[3:0]=b;for(i=0;i<4;i=i+1)  if(a[i])  begin shiftb=shiftb<<i;mu=mu+shiftb;end  else   begin shiftb=shiftb<<i;mu=mu+4'b0000;end  end   endendmodule
自己写的两个4位二进制数移位相乘的Verilog HDL程序 不知错在哪


看着两段代码功能不一样,但错误的本质是一样的。这里不对两段代码的编码风格做分析,也不考虑算法是否能实现预期功能,只考虑复位问题。因为两段代码的错误根本都是由于输出端口没有初始化,就直接参与了中间逻辑运算,这样一个信号x,与别的信号运算,不管是0还是1,结果还是x

以前看过一本教材,说电子系的人学verilog思维偏电路,容易忽略一些编程的细节;而学计算机的人学verilog思维偏编程,容易忽略语言对应的硬件结构。也许我之前编程稍微熟一些,所以一开始就关注到变量的初始化问题。其实在硬件电路里也是有复位的,完全可以增加一个复位信号初始化一下中间使用到的变量。或者遇到第二个例子中的情况,不要写了if不写else,描述成不必要的锁存器结构,可以利用这个else,在start信号为低电平的时候,将mu初始化为0,这样问题就解决了。

原创粉丝点击