最近在百度知道里见过两个问题,如下:
问题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被忽略了
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) begin shiftb[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 end endmodule
看着两段代码功能不一样,但错误的本质是一样的。这里不对两段代码的编码风格做分析,也不考虑算法是否能实现预期功能,只考虑复位问题。因为两段代码的错误根本都是由于输出端口没有初始化,就直接参与了中间逻辑运算,这样一个信号x,与别的信号运算,不管是0还是1,结果还是x
以前看过一本教材,说电子系的人学verilog思维偏电路,容易忽略一些编程的细节;而学计算机的人学verilog思维偏编程,容易忽略语言对应的硬件结构。也许我之前编程稍微熟一些,所以一开始就关注到变量的初始化问题。其实在硬件电路里也是有复位的,完全可以增加一个复位信号初始化一下中间使用到的变量。或者遇到第二个例子中的情况,不要写了if不写else,描述成不必要的锁存器结构,可以利用这个else,在start信号为低电平的时候,将mu初始化为0,这样问题就解决了。