如何避免在Verilog中使用多个常量驱动程序

时间:2019-11-14 19:13:29

标签: verilog system-verilog

我在initial块中有一些变量

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

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

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

这样做会产生错误“无法解析多个常量驱动程序”,我知道为什么会发生,但是还有另一种解决方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题