Verilog и условие для блока Always - PullRequest
0 голосов
/ 10 ноября 2019

Я работаю над проектом, и после того, как выследил ошибку, я сузил ее до причины, вызванной блоком 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 

Один из блоков всегда должен срабатывать при done AND (cntr_var == clk_len).

Я попытался использовать && и and в качестве логического оператора. Почему это не работает?

1 Ответ

2 голосов
/ 10 ноября 2019

Ваша первая большая проблема - @(expression) означает «дождитесь, пока выражение не изменит значение» . Это изменение может быть от 1➩0 или 0➩1. Обычно используется только always @(posedge clk) для синхронной логики или always @(*) для комбинационной логики. (always_comb в SystemVerilog)

Ваша другая проблема заключается в том, что вы должны делать присваивания определенной переменной только из одного, и только одного блока.

...