2

( 本当に基本的な質問の免責事項をここに挿入してください )

より具体的には、次の宣言があります。

output reg icache_ram_rw

そして、コードのある時点で、この reg にゼロの値を入れる必要があります。これが私が試したことと結果です:

assign icache_ram_rw = 1'b0;
( declarative lvalue or port sink reg icache_ram_rw must be a wire )

icache_ram_rw <= 1'b0;
( instance gate/name for type "icache_ram_rw" expected - <= read )

結局どうしよう!?

4

4 に答える 4

32

出力宣言から「reg」を削除すると、コードが機能するはずです (デフォルトはワイヤ出力タイプ)。

ほとんどの独学または不十分な教育を受けたエンジニアが Verilog で理解するのが難しいと感じることが 2 つあります。 papers/CummingsSNUG2000SJ_NBA.pdf ) および (2) reg -vs- ワイヤー。後者のトピックは今すぐ片付けましょう。

左側 (LHS) または手続き型代入 (常に、初期、タスク、関数) にあるものはすべて、変数型 (通常は reg) として宣言する必要があります。言語の他のすべてはネット (通常はワイヤ) です。例外なく。それは本当に簡単です。それを簡単に述べている Verilog の本を私は知りません。

どうしてそうなった?Verilog 言語の良き友人であり発明者である Phil Moorby に、「なぜ reg??」と尋ねました。Phil は、Verilog を発明したとき、合成ツールはなく、always ブロックから出力されるものはすべてレジスタになると考えていたと私に言いました。彼は間違っていたので、今はこの "reg" キーワードに行き詰まっています。

私は 10 年以上にわたり、Veirlog および SystemVerilog 委員会でこれを変更しようと試みてきました。私はすべてをワイヤーとして宣言したいと思います。最初の使用法は、「ワイヤー」がregのように動作するか(手続き型ブロックからの最初の割り当てと最後の割り当てが勝つ)、またはワイヤーのように動作するかを決定します(最初の割り当てはモジュール出力または連続的な割り当てと複数のドライバーは現在の Verilog のように解決されます)、同じ信号に対して手続き型の割り当てとドライバーの割り当ての両方を行うことは違法です。悲しいかな、私は委員会でこの提案を可決するのに十分な票を獲得できませんでした。

これは、私が自分のコードで最もよく犯す間違いです。「不正な LHS 割り当て」や「不正な割り当てへの割り当て」などのエラー メッセージに慣れてください。どちらも同じ意味です。regs を宣言するのを忘れていました。

よろしく - Cliff Cummings - Verilog & SystemVerilog Guru

于 2012-06-27T21:19:47.947 に答える
16

このassignステートメントは、s を駆動するために使用されwireます。

として宣言されているものがある場合はreg、プロシージャ(alwaysまたはinitialブロック)内で値を指定する必要があります。同じブロック内でregs の値のみを設定することをお勧めします。always例えば:

always @( * ) begin // combo logic block
   if( some_condition ) begin
      icache_ram_rw = 1'b0;
   end else begin
      icache_ram_rw = something_else;
 end

regとの間には重要な違いがあるのでwire、よく読んでください。

RAM信号を駆動している場合は、クロックされたロジックが必要になると思います。この場合、次のようなコードが必要になります。

// some parameter definitions to make logic 'read' clearer.
localparam READ = 1'b0; 
localparam WRITE = 1'b1;

// standard clocked logic 'template' that synthesis tools recognise.
always @( posedge clk or negedge resetb )
  if( !resetb ) begin  // asynchronous active low reset
     icache_ram_rw <= READ;
  end else if( some_enable_condition ) begin
     icache_ram_rw <= WRITE;
  end else begin
     icache_ram_rw <= READ;
  end
于 2009-11-27T18:01:06.540 に答える
3

次のように、reg を宣言するときに、reg に初期値を割り当てることもできることに注意してください。

output reg icache_ram_rw = 1'b0;

これにより、シミュレーションでゼロ値から開始することが保証されます。合成の場合、結果は合成ツールとターゲット テクノロジによって異なります (FPGA の場合は通常、ハードウェアの初期値を割り当てることができますが、ASIC の場合はそうではありません)。

于 2009-12-03T23:39:08.100 に答える