因为这两个if语句最后实现电路的情况完全由不同的综合工具自已定义,最终电路不可确定。 - if…else问题
出现了一个 if,必然要出现与之对应的else,否则电路中就容易出现锁存器。
锁存器这种电路结构在非故意使用的情况下出现就是错误的,而else的不使用是造成锁存器被综合出来的原因之一。
修改: reg [1:0]out;always @(posedge clock)begin if(s==2'b00)out<=2'b00; else if(s==2'b11)out<=2'b11; else out<=2'b11;end
case中缺少default
在case语句中也容易出现锁存器 例: reg [1:0] sel; always @(sel,a,b)begin case(sel) 2'b00:out = a + b; 2'b01:out = a - b; 2'b00:out = a + b; 2'b00:out = a + b;end
该case语句中缺少了default,效果和if语句中缺少case一样,容易被综合工具综合成锁存器,无论default情况是否存在都要添加这一项,而且不要对其赋值为x,类似于:default: out= 2' bxx; 这样在仿真过程中是可以的,运行时比较类似电路刚启动所处的未知状态,但实际综合过程中x值是被忽略的,所以要给出一个明确的赋值。 如果设计者不知道应该在default中产生什么输出值,或者在else中产生什么输出值,也可以仅添加一个default而不添加任何语句,如下:default:; 组合与时序混合设计
栗子: reg x, y, Z;always @(x, y,z, posedge reset)begin //时序 if(reset) out = 0; //时序 else out = x ^ y ^ Z; //组合end
一方面希望完成异或,另一方面又希望能在一个always结果中完成清零过程,得到一个混合设计模块。 从根本上将二者划分开是最好的解决途径: reg x,y,Z;always @(posedge reset)begin if(reset)begin x<=0; y<=0; z<=0; end else …endassign out =x^y^z;
在建立可综合模型时,能使用数据流语句实现组合逻辑电路时应尽量使用数据流描述建模,而不要使用行为级的阻塞赋值,因为assign语句层次较低,综合转化不容易发生歧义,所写语句与最后实现电路一致性较高。
|