| 2.2.2 较复杂的场景 .....
 .....
 always @(posedge clk)
 begin
 if(cond1[7:0] == 8'h55)
 q <= 1’b0;
 else if(cond2[7:0] == 8'haa)
 q <= 1’b1;
 else if(cond3[7:0] == 8'h0f)
 q <= 1’b0;
 else if(cond4[7:0] == 8'h00)
 q <= 1’b1;
 else;
 end
 .....
 .....
 在寄存器的输入相对复杂的情况下, 综合工具有很大的空间去做优化. 一种可能的优化结果是, 在不改变逻辑功能的前提下, 综合工具为了降低数据输入端D的逻辑复杂度,抽取一个节点信号或作RST,或作SET.
 例如,综合工具可以随机的输出下面三种结果中的一个, 虽然他们的逻辑功能都是一样的, 但是初值就完全不同.这样就会出现两次编译的初值不一致的情况.
 Case 1. 把部分信号打包到RST端,寄存器初值为0
 Q . D = f1( cond2, cond3,cond4,f2);
 Q . RST = f2(cond1,f1);
 Case 2. 把部分信号打包到SET端,寄存器初值为1
 Q . D = f3(cond1, cond3,cond4, f4);
 Q . SET = f4(cond2,f3);
 Case 3. 不用RST/SET,寄存器初值为0
 Q . D = f5(cond1, cond2, cond3,cond4);
 Q . RST = GND ;
 
 那么,怎么办?
 办法 1 : 对于这种情况, 把代码风格改一改,使用下面的代码风格,可以让每次编译都有一致的初值0. 用两个process来描述寄存器,第一个纯组合,第二个纯时序, 并使用综合约束syn_keep(以Synplify为例)来保留组合逻辑节点.
 ...
 reg q_buf;
 always @(*)
 begin
 if(cond1[7:0] == 8'h55)
 q_buf <= 1’b0;
 else if(cond2[7:0] == 8'haa)
 q_buf <= 1’b1;
 else if(cond3[7:0] == 8'h0f)
 q_buf <= 1’b0;
 else if(cond4[7:0] == 8'h00)
 q_buf <= 1’b1;
 else;
 end
 always @(posedge clk) begin
 q <= q_buf ;
 end
 .....
 办法 2 : 对于这种情况,有些综合工具支持上电初值预设,具体可以查看帮助.
 办法 3 : 代码中定义寄存器的同时赋初值,如:
 reg [3:0] myreg = 4’b0101 ;
 这其实是仿真语法, 本来不能用于综合synthesis的. 但有些综合工具的某些版可以识别为初值, 但是不能够确保一定被识别. 不建议使用.
 
 小结
 可见, 寄存器初值是由综合工具决定的,用户可以通过适当的代码风格, 或者综合选项等设置寄存器初值. 如果对于寄存器的初值不作约束, 综合工具可以有更大的优化空间,降低逻辑级数.
 |