从输出声明中删除“reg”,代码应该可以工作(默认为线输出类型)。
在 Verilog 中,大多数自学成才或学得不好的工程师发现有两件事难以理解:(1)阻塞-vs-非阻塞分配(请参阅我关于此主题的论文:http: //www.sunburst-design.com/论文/CummingsSNUG2000SJ_NBA.pdf ) 和 (2) reg -vs-wire。让我们现在澄清后一个主题。
左侧 (LHS) 上的任何内容或过程赋值(always、initial、task、function)都必须声明为变量类型(通常是 reg)。该语言中的其他所有内容都是网(通常是电线)。没有例外。真的就是这么简单。我不知道有任何 Verilog 书能这么简单地说明这一点。
这怎么发生的?我问 Verilog 语言的好朋友和发明者 Phil Moorby,“为什么要注册??” Phil 告诉我,当他发明 Verilog 时,还没有综合工具,他认为从 always 块中出来的所有东西都将是一个寄存器。他错了,现在我们被这个“reg”关键字困住了。
十多年来,我一直试图在 Veirlog 和 SystemVerilog 委员会上改变这一点。我想将所有内容声明为线,第一次使用将确定“线”的行为是否像 reg(来自程序块的第一个分配和最后一个分配获胜)或行为像一个线(第一个分配来自驱动源,例如模块输出或连续分配和多个驱动程序在今天的 Verilog 中得到解决)并且对同一信号进行程序分配和驱动程序分配是非法的。唉,我在委员会中没有足够的票数来成功通过这个提案。
这是我在自己的代码中最常犯的错误。只需习惯错误消息,例如“非法 LHS 分配”或“非法分配电线”。它们的意思是一样的,你忘了声明你的regs。
问候 - Cliff Cummings - Verilog 和 SystemVerilog 大师