Verilogでは、assignを使用してリセットを実装することは合法ですか?

Aug 25 2020

カウンターにリセットを追加しようとしていますが、完全に合成される次のコードがあります。

module syncRX(clk, signal, detect);
    input clk, signal;
    output [7:0] detect;
    
    reg [7:0] detect_aux = 8'b0;
    reg rst;
    assign detect = detect_aux & ~rst;
    
    freq_div div(.clk(clk), .clk_1khz(clk_1khz));
    
    always @(posedge signal)
        rst <= 1;
        
    always @(posedge clk_1khz)
        detect_aux <= detect_aux + 1;
     
endmodule // top

module freq_div(input clk, output reg clk_1khz);
    reg [12:0] count = 0;
    always @(posedge clk)
     begin
        if(count == 6000)
            begin
                clk_1khz <= ~clk_1khz;
                count <= 0;
            end
        else
            count <= count + 1;
     end
endmodule

問題はそれです

    reg rst;
    assign detect = detect_aux & ~rst;

継ぎ目は何もしません。私が試みていることは合法ですか?ありがとう

回答

1 schnedan Aug 25 2020 at 04:03

すでに述べたように、値をrstから「1」に変更することはありません。

次に、最初はチップ設計の観点からリセットされませんが、明確な信号なので、名前をclrに変更します。

モジュールの実際のリセットに関する「すべて」: http://www.asic-world.com/tidbits/all_reset.html

3 ThePhoton Aug 25 2020 at 03:51

コメントで指摘されているように、コードでrstは常に0であるため、の値に影響を与えることはありませんdetect。リセットを実行したい場合はrst、モジュールに入力を行い、テストベンチのある時点でそれを高く設定する必要があります。

ただし、これは実際にはリセット動作ではないことにも注意してください。rstHighに設定するdetectと、モジュールの出力は強制的にゼロになりますが、rstLowdetectに戻るとすぐに、に格納されている以前の値に戻りdetect_auxます。これが適切なリセットである場合、rstリリース後に0からカウントが新たに開始されると予想されます。