XST和synplify综合出的结果完全不一致
时间:10-02
整理:3721RD
点击:
用的是xillinx的XC2C32A,很老的CPLD。就是一个流水灯小程序。XST能实现流水灯显示。但是在synplify综合后,4个LED一直常亮。到底是哪里的问题呢?
代码如下:
module Main(
iCLK,
oLED
);
input iCLK;
output [3:0]oLED;
reg [24:0]sr_counter = 25'b0;
reg [3:0]sr_led = 4'b1110;
assign oLED = sr_led;
always@(posedge iCLK)
if(sr_counter >= 25'd25000000)
sr_counter <= 1'b0;
else
sr_counter <= sr_counter + 1'b1;
always@(posedge iCLK)
if(sr_counter >= 25'd25000000)
sr_led <= {sr_led[2:0],sr_led[3]};
else
sr_led <= sr_led;
endmodule
代码如下:
module Main(
iCLK,
oLED
);
input iCLK;
output [3:0]oLED;
reg [24:0]sr_counter = 25'b0;
reg [3:0]sr_led = 4'b1110;
assign oLED = sr_led;
always@(posedge iCLK)
if(sr_counter >= 25'd25000000)
sr_counter <= 1'b0;
else
sr_counter <= sr_counter + 1'b1;
always@(posedge iCLK)
if(sr_counter >= 25'd25000000)
sr_led <= {sr_led[2:0],sr_led[3]};
else
sr_led <= sr_led;
endmodule
看到3个问题:
1. 寄存器声明时不能初始化!
2. 寄存器没有初始化!
3. sr_counter <= 1'b0; 这句话只把sr_counter[0] 清零,其他位没变!
虽然很抱歉,但你这三句话都是错的......
为什么我觉得2楼三句都是对的?
谢谢您的指教,那为什么XST综合和synplify相差那么大呢
请指教
可能SYNPLIFY对语法和代码规范要求更高,不管用什么综合工具,代码规范很重要
1 仿真时是没问题的,可以这样写 2 寄存器没有加上复位信号,所以理论上sr_led在综合的时候,是没有初值的,但FPGA上电时可能初始成0,这样,不管怎么移位,4位的sr_led因为是全0,移来移去还是0,当然看不到灯闪(小编应该是0灯亮,所以4个灯常亮)
3 完全错误,即使写成1'b0,也会把sr_counter所有的位置成全0,而不是只有一位。
synplify的结果是完全正确的,电路结果就是灯全亮。小编用xst的结果才是错的,可能原因是xst不规范,综合的时候将初始值设成了寄存器的初始状态。(实际上不能这样综合,但恰好是小编想要的结果)
参考我的回复。

哦,意思就是synplify会把值初始化,这可能是综合工具在对FPGA综合时的例外情况吧,非常不推荐这么做,这个功能在ASIC综合时就没辙了,我们一般代码都是FPGA/ASIC通用,从来不这么写。
但是从小编的结果来看,有可能是没有初始化成功,或许synplify各版本有差别?
