我有一个实例化两个模块的顶级模块:
fillRam fillRam1(
  .clk(mclk),
  .ramaddrb(ramaddrb),
  .romaddrb(romaddrb),
  .romoutb(romoutbwire),
  .raminb(raminb));
vga vgainst(
  .ck(mclk),
  .HS(HS),
  .VS(VS),
  .outRed(OutRed),
  .outGreen(OutGreen),
  .outBlue(OutBlue),
  .sw(sw),
  .romouta(romoutawire),
  .ramouta(ramoutawire),
  .romaddra(romaddra),
  .ramaddra(ramaddra));
在这个顶部模块中,我还有两个模块可以连接 RAM 和 ROM。
rom rom_instance (
  .clka(mclk), // input clka
  .addra(romaddrawire), // input [14 : 0] addra
  .douta(romouta), // output [7 : 0] douta
  .clkb(ck), // input clkb
  .addrb(romaddrbwire), // input [14 : 0] addrb
  .doutb(romoutb) // output [7 : 0] doutb
);
我想做的是,从 vga 模块获取 romaddra 值,将其提供给 rom_instance,然后获取 romouta 值并将其返回给 vga 模块。我为此声明了两个变量:
reg  [14:0] romaddra;
wire  [14:0] romaddrawire;
reg [7:0] romouta;
wire [7:0] romoutawire;
assign romaddrawire = romaddra;
assign romoutawire = romouta;
在每个时钟周期中,我从 vga 实例中获取 romaddra 值,将其写入 romaddrawire 并将其提供给 ROM 实例。然后我获取 romouta 值,将其写入 romoutawire 并将其返回给 VGA 实例。
我对其他 rom 端口和 ram 端口也有类似的声明。但在所有这些中,我都得到了这个错误。
ERROR:HDLCompilers:102 - "top.v" line 82 Connection to output port 'romaddra' must be a net lvalue
在 vga verilog 代码中:
output reg [14:0] romaddra;
在 rom verilog 中:
output [7 : 0] douta;
我对整个 reg 和 wire 类型感到非常困惑。如果有人解释这里出了什么问题以及原因,我会很高兴。谢谢。