OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1142|回复: 4

[XILINX] 仿真和实际不一致,原来是敏感变量的原因

[复制链接]

5

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2023-12-1
在线时间
4 小时
发表于 2023-12-6 21:06:09 | 显示全部楼层 |阅读模式
想要实现的功能:按下按键后,改变state寄存器的值,并且按键按下后是边缘触发的。
仿真pass,但是综合后刷进FPGA后无法实现仿真的功能。

原代码如下:
reg [1:0] state;
assign key_sum = &key[3:0];
always @(negedge  key_sum) begin
        case (key[3:0])
            4'b1110:state[1:0] <= 2'b00;
            4'b1101:state[1:0] <= 2'b01;
            4'b1011:state[1:0] <= 2'b10;
            4'b0111:state[1:0] <= 2'b11;
        endcase
end


今天看到有帖子说,这种情况可能是边缘触发的敏感变量在下文的代码中没有被检测到,属于“编译器”的差异。
修改代码如下(增加了一个if)
always @(negedge  key_sum) begin
    if(!key_sum)
        case (key[3:0])
            4'b1110:state[1:0] <= 2'b00;
            4'b1101:state[1:0] <= 2'b01;
            4'b1011:state[1:0] <= 2'b10;
            4'b0111:state[1:0] <= 2'b11;
        endcase
end
异常被修复

总结:这vivado的综合能力真是堪忧啊。。。。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2023-12-1
在线时间
4 小时
 楼主| 发表于 2024-1-10 23:02:02 | 显示全部楼层
今天又发现一个,wire变量如果被赋上初值,也会出仿真和实机不一致的情况。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2023-12-1
在线时间
4 小时
 楼主| 发表于 2024-1-13 16:16:00 | 显示全部楼层
又发现一个:双边沿触发器在时钟的每个上升沿和下降沿都会触发。但是在FPGA中没有双边沿触发器,并且像always @(posedge clk or negedge clk)这样的描述方式并不合法。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2023-12-1
在线时间
4 小时
 楼主| 发表于 2024-1-22 21:34:41 | 显示全部楼层
今天又发现一个,如果多个always语句用了多个不同的信号,可能会导致仿真和实际不一致。可能是布线资源不足?
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2023-12-1
在线时间
4 小时
 楼主| 发表于 2024-1-27 00:23:37 | 显示全部楼层
今天看书找到了另一个原因:
目前大多数综合器不能综合异步状态机,千万不要使用综合工具来设计异步状态机。因为目前大多数综合工具在对异步状态机进行逻辑优化时会胡乱地简化逻辑,使的综合后的异步状态机不能正常工作。
如果一定要设计异步状态机,建议采用电路图输入的方法(或使用实例引用的写法把几个引用的实例用异步时钟连起来)
参考《Verilog数字系统设计教程》夏宇闻
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表