【问题标题】:Verilog Error: Must be connected to a structural net expressionVerilog 错误:必须连接到结构网络表达式
【发布时间】:2015-10-12 21:08:56
【问题描述】:

我收到错误消息:output or inout port "Qout" must be connected to a structural net expression。我在下面的代码中注释了错误发生的行(代码被修剪/压缩)。我搜索了答案,似乎我无法将输入/输出端口分配给 reg。我认为一种解决方案是将 Q 更改为线,但 Q 是我的 EightBitRegister 模块中的 always-block 的一部分,所以它必须是一个 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

【问题讨论】:

    标签: module verilog


    【解决方案1】:

    首先,endmoduleflipflop F0 实例化后丢失。 Verilog 不支持嵌套模块(这可能是拼写错误)。

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

    模块的输出必须连接到wire。即使Qout 是一个输出端口,它也用作驱动Q 的逻辑的输入。因此,您需要从register 模块中取出一根电线,并用它来驱动eightBitRegister 模块中的Q

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

    我稍微修改了你的代码。在这里,临时电线用作解决方法。代码可在EDAPlayground 获得。

    【讨论】:

    • 嗯,从技术上讲,SystemVerilog 中允许嵌套模块(不确定它添加了哪个版本的规范)。但是,我不知道支持它的工具(EDAPlayground 上的模拟器都没有)。
    • @Unn 是的,你是对的。我已阅读 SystemVerilog IEEE LRM Std 1800-2012 第 23.4 节嵌套模块,并相应地编辑了我的答案。但是很多模拟器还没有实现这个功能。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多