【问题标题】:Is it okay to use module's output as an input of submodule in Verilog?可以使用模块的输出作为 Verilog 中子模块的输入吗?
【发布时间】:2021-11-30 13:12:11
【问题描述】:

您好,我是 Verilog 的新手,我对设计模块有一些疑问。
是否可以将顶层模块的输出用作子模块的输入(将两个模块都作为顺序逻辑)?
根据我对触发器的直觉,这似乎没问题,但我不确定这种方法在 verilog 编码中是否可以接受(无论如何是逻辑的或传统的)。这种编码应该避免吗?

module sample_top(
    input a,
    input b,
    input c,
    output d,
    output e
    );
    
    //sequential
    sample_submodule_1 SAMPLE_SUBMODULE_1(
        //input of submodule
        .A(a),
        .B(b),
        //output of submodule
        .D(d)
        );

    //sequential
    sample_submodule_2 SAMPLE_SUBMODULE_2(
        //input of submodule
        .C(c),
        .D(d),
        //output of submodule
        .E(e)
        );

感谢您的回答。

【问题讨论】:

  • 是的,没关系。你试过了吗?
  • 谢谢!!,我还没有尝试过,因为我的总代码很大而且还不完整。我只是想确定这种方法是否可用。你知道,在你花了很多时间尝试之后弄清楚你内在的误解会有点难过。此外,我也很好奇这种递归在 Verilog 社会中是否可以接受。

标签: verilog


【解决方案1】:

Verilog 语言并不真正关心端口方向。层次结构仅用于创建名称空间和行为容器。端口连接变成了 aA 到单个连线对象的符号命名。

VHDL 等其他 HDL 对读取值输出有限制。这些 HDL 之间的区别在于这些语言如何解析多个驱动程序(这将花费太多时间来了解这里)。在 Verilog 中,如果端口的一侧是变量(reg),另一侧是连线,您可以看到多个驱动程序解析的效果。只有端口的接线端才能看到多个驱动程序的解析值。

【讨论】:

    【解决方案2】:

    不应引用输出信号。这是建议(最佳实践)。许多专业的 linter 将其视为警告或通知。

    • 输出和子模块输出直接连接没问题(你的子模块1)。
    • 输出和子模块输入的直接连接违规(您的子模块 2)。
    • 直接连接输出和函数返回即可。
    • 输出和函数输入参数的直接连接是违规的。
    • 输出和任务输出参数直接连接没问题。
    • 输出和任务输入参数的直接连接是违规的。
    • 对输出端口的其他引用是违规的。

    例如:

    module SOME_MODULE(
        clk,
        rstn,
        a,
        b,
        y
    );
    
        input clk;
        input rstn;
        input [3 : 0] a;
        input [3 : 0] b;
        output reg [5 : 0] y;
    
        always @(posedge clk or negedge rstn) begin
            if (~rstn)
                y <= 5'd 0;
            else
                y <= y + a + b;  // Reference to output port detected
        end
    
    endmodule
    

    应描述为:

    module SOME_MODULE(
        clk,
        rstn,
        a,
        b,
        y
    );
    
        input clk;
        input rstn;
        input [3 : 0] a;
        input [3 : 0] b;
        output [5 : 0] y;
    
        reg [5 : 0] y_reg;
        assign y = y_reg;
    
        always @(posedge clk or negedge rstn) begin
            if (~rstn)
                y_reg <= 5'd 0;
            else
                y_reg <= y_reg + a + b;
        end
    
    endmodule
    

    【讨论】:

    • 感谢您的友好回答。如果这是模块设计的潜规则,我最好遵循它!
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2021-07-08
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多