最近在项目设计时,遇到了信号多驱动问题。
记录下来,提醒自己,方便他人。
最近在设计YOLO—V3的模块逻辑。
在准备上FPGA时,综合报错:信号多驱动错误。
查看代码后,发现是在不同的always@语句中对同一个信号进行了赋值,造成了多驱动问题。
比如:
logic a;
logic b;
logic c;
always @ (posedge clk_1) begin
if(b > 0)
a <= 1'b1;
end
end
always @ (posedge clk_1) begin
if(c > 0 && b < 0) begin
a <= 1'b0;
end
end
如上图所示,因为在两个不同的always块中对信号a进行了赋值,于是造成了多驱动错误。
这个错误,在仿真时并不会报错,但是在综合时,就会报错,一定要避免这个问题。
明白原因后,解决这个问题,还是不难的。
解决办法:
只在一个always块中对信号a进行赋值。
logic a;
logic b;
logic c;
always @ (posedge clk_1) begin
if(b > 0)
a <= 1'b1;
end
else if(c > 0 && b < 0) begin
a <= 1'b0;
end
end
上面只是简单的例子。
实际项目中,代码比这个复杂很多,修改难度也相应大很多。
比如,上面只涉及到一个时钟,而且控制条件互斥,所以很好修改。
但是,很多时候,代码很难修改。比如,出现如下情况。
假如:
logic a;
logic b;
logic c;
always @ (posedge clk_1) begin
if(b > 0)
a <= 1'b1;
end
end
always @ (posedge clk_2) begin
if(c > 0 && b < 0) begin
a <= 1'b0;
end
end
logic a;
logic b;
logic c;
always @ (posedge clk_1) begin
if(b > 0)
a <= 1'b1;
end
end
always @ (posedge clk_1) begin
if(c > 0 ) begin
a <= 1'b0;
end
end
logic a;
logic b;
logic c;
always @ (posedge clk_1) begin
if(b > 0)
a <= 1'b1;
end
end
always @ (posedge clk_2) begin
if(c > 0 ) begin
a <= 1'b0;
end
end
以上三种情况,怎么解决呢?
留待思考。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务