0

Thomas Moorby の「The Verilog HDL」という本から、Verilog プログラミングを独学で学ぼうとしていました。演習の 1 つで、彼らは構造的な Verilog のみを使用してクロックを生成するように要求しました (もちろん $monitor 部分を除く)。

私は次のことを試しました:

module clock();
    wor clk;
    assign clk=0;

    initial begin 
        $monitor($time,,"clk=%b", clk);
        #100 $finish;
    end

    assign #5 clk = ~clk;
endmodule

問題は、iVerilog 0.9.7 では動作しますが、バージョン 10.0 以降では動作しないことです.clk の未定義の値を取得するだけです!

iVerilog のバグではないようです。それ以外の場合は、10.x リリースのいずれかで修正されている可能性があります。これを機能させる他の方法はありますか?また、現在のコード (もしあれば) の何が問題なのですか?

4

2 に答える 2

0

奇妙なコード、clkまたはゲート動作を使用してドライブを解決しています。最初assignは常に運転してい0ます。2 つ目assignは、解決された値を反転することです。worしかし、2 番目の入力の初期値は何ですか? assignその 2 番目は最初に生成されませんかX( Xored で0が生成されますX)。シミュレーターで実行したり、少なくともどこかに描画したりして、どのハードウェアを入手したいですか? それはあなたが餌を与えているようなもので、0 or'ed with Xそれを使って生産しXます。

時計をモデル化したい場合は、次のことができます。

1)最初に変換assignしますinitial begin clk = 0; end

2) 2 番目assignalways

3)clk regタイプを作る

合成可能なクロックジェネレーターが必要な場合は、発振源、PLL などが必要になります。

于 2018-03-20T16:05:05.660 に答える
0

これはあなたが持っている厄介なコードです。通常、次のいずれかの regs で行われるクロック生成

reg clk;
initial begin
    clk = 0;
    forever 
         #5 clk = ~clk;
end

また

 always 
     #5 clk = ~clk;
 initial 
     clk = 0;
于 2018-03-20T19:25:08.017 に答える