Verilog 和 Always 阻止的条件

Verilog and condition for Always block

提问人:TomatoLV 提问时间:11/10/2019 更新时间:11/10/2019 访问量:1880

问:

我正在做一个项目,在追查到一个错误后,我将其缩小到它是由无法正确触发的 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 块应该在 AND 时触发。done(cntr_var == clk_len)

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

Verilog Active-HDL

评论

3赞 Oldfart 11/10/2019
所写的东西根本行不通,或者说是意外。你的整个编码风格是错误的。你有从上到下的比赛条件。我建议你看看一些真正有效的Verilog代码,看看它们做了什么。从一个时钟部分开始,它也有复位,第二个组合部分使用。always @( * )
0赞 TomatoLV 11/10/2019
好吧,它不是一个独立的计数器。启动信号进来并告诉计数器启动,一旦完成,它必须以某种方式将其信号传回主模块
0赞 Serge 11/10/2019
您的模块中已经有时钟并重置。请找到正确使用时钟和复位的示例,并尝试完全重写您的代码以使用正确的样式。你拥有它的方式是行不通的。从对简单的独立触发器进行建模开始。

答:

3赞 dave_59 11/10/2019 #1

你的第一个大问题是意味着“等到表达式有值变化”。该更改可能是 1➩0 或 0➩1。通常,仅用于同步逻辑或组合逻辑。(在 SystemVerilog 中)@(expression)always @(posedge clk)always @(*)always_comb

你的另一个问题是,你应该只从一个变量中分配一个特定的变量,并且只有一个总是阻塞。