2016-08-30 8 views
1

私がalwas_combalways_offの両方を最初のモジュールで実行しているのであれば?SystemVerilogでどのプロシージャブロックが最初に実行されるのですか?

たとえば、このコードを本で見たことがありますが、その機能について混乱しています。たとえば、WE = 0の場合は、の値になります。Qout

module SyncRAM #(parameter M = 4, N = 8)(output logic [N-1:0] Qout, 
    input logic [M-1:0] Address, input logic [N-1:0] Data, input logic clk, WE); 

logic [N-1:0] mem [0:(1<<M)-1]; 

always_comb 
    Qout = mem[Address]; 

always_ff @(posedge clk) 
    if (~WE) 
    mem[Address] <= Data; 

endmodule 

このコードの真理値表に関するすべてのヘルプは高く評価され、あなたの質問に に関して

答えて

0

具体的な答えがQoutがちょうどmem[Address]の値を追跡することです。言い換えると、クロックの立ち上がりエッジで、WEが0の場合、Qoutはメモリに書き込まれた値でドライブされます。これは、メモリがフリップフロップのバンクのように動作し、Qoutの出力がフリップフロップのバンクのQ出力に直接接続されているかのように動作するためです。 Qoutブロッキング割り当て=)を使用して駆動されるので、メモリは非ブロッキング代入<=)を使用して書かれているのに対し、

2つのalwaysブロックの実行の順序は、決定論的です。詳細については、hereの回答を参照してください。

+0

私が正しく理解している場合、WEが0の場合、Qoutは以前の値を保持し、mem [Address]は更新されます。 ありがとうございます。次のクロック・サイクルで、更新されたmem [Address]がWE = 0またはWE = 1のQoutに割り当てられます。そうですか – user42037

+0

@ user42037申し訳ありません。私は完全なナンセンスを話していた。 (それは朝早すぎるはずです)私は自分の答えを編集しました。 –

関連する問題