0

我正在做一个项目,在追查了一个错误后,我将其范围缩小到它是由一个未正确触发的 Always 块引起的。

module Counter(start,clk_len,done,clk,reset);     

    input [4:0] clk_len;
    input clk,start,reset;
    output done;
    reg [4:0] cntr_var = 0; reg start_val = 0; 
    assign done = !start_val;       
    reg test = 0;

    always @(reset){cntr_var,start_val} = 2'b0;

    always @(posedge start) begin
        start_val = start;
    end      

    always @((done and cntr_var == clk_len)) begin // <=== This is the source of the problem
        cntr_var = 0;
        start_val = 0; 
        test = 1;
    end             

    always @(clk and !reset) begin  
        if (start_val == 1 && cntr_var != clk_len)
                cntr_var = cntr_var + 1;
    end 

endmodule 

always 块之一应该在doneAND时触发(cntr_var == clk_len)

我尝试同时使用&&and作为逻辑运算符。为什么这不起作用?

4

1 回答 1

3

您的第一个大问题是@(expression)等到表达式发生值更改”。这种变化可能来自 1➩0 或 0➩1。通常仅always @(posedge clk)用于同步逻辑或always @(*)组合逻辑。(always_comb在 SystemVerilog 中)

您的另一个问题是您应该只对一个特定变量进行分配,并且只有一个总是阻塞。

于 2019-11-10T02:00:43.863 回答