【问题标题】:Assigning an ID number or code to Verilog module为 Verilog 模块分配 ID 号或代码
【发布时间】:2014-04-21 08:23:17
【问题描述】:

我在 Verilog 中设计了一个模块 (A),我需要在顶层模块中实例化它四次。这两个模块相互通信并与其他一些模块通信。 “A”发出一些信号,“A”的其他实例应该接受这些信号。信号通过接口或总线发送。我不想通过合并任何标准总线协议使设计复杂化。我创建了一个 inout 端口,以避免输入和输出使用相同类型的端口。

有没有办法为每个实例分配一个 id 或一个代码,以便每个实例检查该 id 并接受来自与其不同 ID 的信号。现在没有 id 或标准总线协议,模块也在接受自己的信号,这是不应该发生的。

【问题讨论】:

    标签: verilog


    【解决方案1】:

    您可以通过以下方式做到这一点:

    1. 添加 ID 输入端口
      当此端口设置为常数时,设备在上电时可以检测到其 ID。从技术上讲,您可以使用它来做动态 ID,但通常您只需将端口连接到一个常量值。这是最灵活的选项,特别是如果您希望将最终产品用作可配置组件。
      module A ( /* your_ports */, input [1:0] ID );
      /* ... code ... */
      endmodule
      module top;
      A inst0 ( .ID(2'd0), .* );
      A inst1 ( .ID(2'd1), .* );
      A inst2 ( .ID(2'd2), .* );
      A inst3 ( .ID(2'd3), .* );
      endmodule
    2. 创建一个 ID 参数
      模拟到 ID 输入端口,除了值是硬编码的,并且实例在编译时知道 ID 值,在模拟或设备上电之前。独特的参数值生成独特的模块。如果 ID 为 0,它将与 ID 为 1 的物理上不同。
      module A #(parameter ID) ( /* your_ports */ );
      /* ... code ... */
      endmodule
      module top;
      A #( .ID(0) ) inst0 ( .* );
      A #( .ID(1) ) inst1 ( .* );
      A #( .ID(2) ) inst2 ( .* );
      A #( .ID(3) ) inst3 ( .* );
      endmodule
      

    【讨论】:

      【解决方案2】:

      为什么不给每个模块设置一个参数,并把它作为一个ID呢?然后为每个实例设置唯一的参数:

      module A;
         parameter ID = 0; //default value
         case (ID)
             0: //specific code for ID0
             1: //specific code for ID1
             2: //specific code for ID2
             3: //specific code for ID3
         endcase
      endmodule
      

      还有你的顶级模块:

      module top;
      
        A #(.ID(0)) inst_0 (...);
        A #(.ID(1)) inst_1 (...);
        A #(.ID(2)) inst_2 (...);
        A #(.ID(3)) inst_3 (...);
      
      endmodule
      

      其他几个有用的点:

      您可能需要检查generate blockvectorized/array module instantiation,它们允许您实例化一个模块数组。

      另外,请注意,通常每个模块都可以看到整个层次结构。在每个模块中,您可以使用hierarchical expression 访问信号:

      module A;
         reg s;
         ....
         initial $display("The initial value of signal s in instance A_2 is:", top.inst_2.s);
      endmodule
      

      请注意,尽管不建议这样做,因为您的模块描述将特定于您的层次结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多