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

How to avoid multiple constant drivers in verilog

我在 initial 块中有一些变量

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

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

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

这样做会产生错误 "can't resolve multiple constant driver",我知道为什么会这样,但是还有其他方法吗??

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

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

最后,您通常不想使用外部异步信号来计时某些逻辑(除非您知道自己在做什么)。您应该编写如下代码:

//---- 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 个触发器同步以避免亚稳态。