出力宣言から「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