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

如何避免verilog中的多个常量驱动程序,verilog,system-verilog,Verilog,System Verilog,我在初始块中有一些变量 initial begin i = 32'b0; j = 32'b1; end 我想在每次按下按钮时用这样的初始值初始化它们 always @(posedge btn) begin i = 32'b0; j = 32'b1; end 这样做会导致错误“无法解析多个常量驱动程序”,我知道为什么会发生这种情况,但是,还有其他方法吗???听起来您正在创建可合成代码(基于您需要按下按钮的情况)。初始块不合成为逻辑,它

我在
初始
块中有一些变量

  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
/----检测btn的上升沿----
注册btn_prev;
电线上升沿;
始终@(posedge clk)

btn_prev哪个工具会给您错误?这里应该没有错误。