如何避免verilog中存在多个常量驱动程序



我在initial块中有一些变量

initial
begin
i = 32'b0;
j = 32'b1;
end

每次按下按钮时,我都想用这样的初始值来初始化它们

always @(posedge btn)
begin
i = 32'b0;
j = 32'b1;
end

这样做会导致错误"无法解决多个常量驱动程序",我知道为什么会发生这种情况,但是,有其他方法吗??

听起来像是在创建可合成的代码(根据您按下按钮的需要(。初始块不合成逻辑,它们仅用于模拟。通常使用重置信号来设置初始值。

此外,您通常希望将任何一个信号的逻辑保留在单个块中,而不是将其分离为单独的块。(同样,这是针对可合成代码的,对于模拟来说这并不重要(

最后,您通常不希望使用外部异步信号来为某些逻辑计时(除非您知道自己在做什么(。相反,你会编写一些代码,比如:

//---- detect rising edge of btn ----
reg btn_prev;
wire rising_edge_btn;
always @(posedge clk)
btn_prev <= btn;
assign rising_edge_btn = ~btn_prev & btn;
// ---- i and j logic  --------------  
always @(posedge clk) begin
if( rst || rising_edge_btn) begin
i <= 0;
j <= 1;
end
else 
//some other logic here
end
end

上面的代码使用同步复位信号"rst"。您还可以找到具有异步重置的设计。将外部异步btn信号与2个触发器同步以避免亚稳态也是一种很好的做法。

最新更新