Module Verilog错误:必须连接到结构网络表达式

Module Verilog错误:必须连接到结构网络表达式,module,verilog,Module,Verilog,我收到错误:输出或inout端口“Qout”必须连接到结构网络表达式。我对下面代码中出现的错误行进行了注释(代码被修剪/压缩)。我搜索了一个答案,但似乎无法将输入/输出端口分配给注册表。我认为一种解决方案是将Q改为导线,但Q是我的eightBitRegister模块中的always块的一部分,所以它必须是reg。我怎样才能避开这个错误呢 `timescale 1ns / 1ns module lab4_3(SW, KEY, LEDR); input [9:0] SW; inpu

我收到错误:
输出或inout端口“Qout”必须连接到结构网络表达式
。我对下面代码中出现的错误行进行了注释(代码被修剪/压缩)。我搜索了一个答案,但似乎无法将输入/输出端口分配给注册表。我认为一种解决方案是将Q改为导线,但Q是我的eightBitRegister模块中的always块的一部分,所以它必须是reg。我怎样才能避开这个错误呢

`timescale 1ns / 1ns

module lab4_3(SW, KEY, LEDR);
    input [9:0] SW;
    input [3:0] KEY; 
    output [7:0] LEDR;

    eightBitRegister eight1(
                .DATA_IN(SW[7:0]),
                .parallelloadn(KEY[1]),
                .rotateRight(KEY[2]),
                .clock(KEY[0]),
                .reset(SW[9]),
                .Q(LEDR[7:0])       
    );      
endmodule

module eightBitRegister(DATA_IN, parallelloadn, rotateRight, reset, clock, Q);
    input [7:0] DATA_IN;
    input parallelloadn;
    input rotateRight;
    input reset;
    input clock;
    output[7:0] Q;


    register reg0(.Qout(Q[0]),  //GETTING ERROR HERE
                .right(Q[1]),
                .left(Q[7]),
                .D(DATA_IN[0]),
                .loadleft(rotateRight),
                .loadn(parallelloadn),
                .clk(clock),
                .rst(reset));

   reg [7:0] Q;
    always @(*)
    begin
     case({parallelloadn,rotateRight})
        2'b00: Q = DATA_IN; 
        2'b01: Q = DATA_IN;  
        2'b11: Q = Q >> 1;
        2'b10: Q = Q << 1;
     endcase
    end

endmodule

module register(Qout, right, left, D, loadleft, loadn, clk, rst);
    input right, left;
    input D;
    wire datato_dff, rotatedata;
    input loadleft, loadn;
    input clk, rst;
    output Qout;

flipflop F0( 
    .d(datato_dff), 
    .q(Qout), 
    .clock(clk),
    .reset(rst) 
);

module flipflop(d, q, reset, clock); 
    input reset, clock;
    input d;
    output q;
    reg q;
    always @(posedge clock)
    begin
        if (reset == 1'b0) 
            q <= 0; 
        else 
            q <= d; 
    end

endmodule
`时标1ns/1ns
模块lab4_3(开关、钥匙、发光二极管);
输入[9:0]SW;
输入[3:0]键;
输出[7:0]发光二极管;
eightBitRegister eight1(
.数据输入(SW[7:0]),
.parallelloadn(图例[1]),
.rotateRight(图例[2]),
.时钟(键[0]),
.重置(软件[9]),
.Q(LEDR[7:0])
);      
端模
模块八位寄存器(数据输入、并行加载、旋转光、复位、时钟、Q);
输入[7:0]数据;
输入并行加载;
输入旋转光;
输入复位;
输入时钟;
输出[7:0]Q;
寄存器reg0(.Qout(Q[0]),//此处出现错误
.对(Q[1]),
.左(Q[7]),
.D(数据单位[0]),
.左装载(右旋转),
.loadn(并行加载),
.clk(时钟),
.rst(重置));
reg[7:0]Q;
始终@(*)
开始
大小写({parallelloadn,rotateRight})
2'b00:Q=数据_IN;
2'b01:Q=数据_IN;
2'b11:Q=Q>>1;

2'b10:Q=Q首先,在
触发器F0
实例化之后,
端模块
缺失。Verilog不支持嵌套模块(这可能是输入错误)

其次,
Qout
由多个驱动程序驱动。您已从
.Qout(Q[0])
驱动
Qout
,即从寄存器模块和
始终
块驱动。这是违法的

模块的输出必须连接到
导线
。即使
Qout
是一个输出端口,它也被用作逻辑驱动
Q
的输入。因此,您需要从
寄存器
模块中取出一根导线,并使用它驱动
八位寄存器
模块的
Q

下图显示了输入、输出和输入输出端口的端口连接规则


我稍微修改了你的代码。此处,临时导线用作解决方法。代码位于。

首先,
触发器F0
实例化后,
端模块
缺失。Verilog不支持嵌套模块(这可能是输入错误)

其次,
Qout
由多个驱动程序驱动。您已从
.Qout(Q[0])
驱动
Qout
,即从寄存器模块和
始终
块驱动。这是违法的

模块的输出必须连接到
导线
。即使
Qout
是一个输出端口,它也被用作逻辑驱动
Q
的输入。因此,您需要从
寄存器
模块中取出一根导线,并使用它驱动
八位寄存器
模块的
Q

下图显示了输入、输出和输入输出端口的端口连接规则


我稍微修改了你的代码。此处,临时导线用作解决方法。该代码可在.

上获得。从技术上讲,SystemVerilog中允许使用嵌套模块(不确定添加了哪个版本的规范)。但是,我不知道有什么工具支持它(EDA上的模拟器都不支持)。@Unn是的,你是对的。我已经阅读了SystemVerilog第23.4节嵌套模块,并相应地编辑了我的答案。但是许多模拟器还没有实现这个特性。感谢您的输入。从技术上讲,SystemVerilog中允许使用嵌套模块(不确定添加的规范版本)。但是,我不知道有什么工具支持它(EDA上的模拟器都不支持)。@Unn是的,你是对的。我已经阅读了SystemVerilog第23.4节嵌套模块,并相应地编辑了我的答案。但是许多模拟器还没有实现这个特性。谢谢你的意见。