为Verilog模块分配ID号或代码

时间:2014-04-21 08:23:18

标签: verilog

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

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

2 个答案:

答案 0 :(得分:0)

为什么不为每个模块设置参数并将其用作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

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

答案 1 :(得分:0)

您可以通过以下方式执行此操作:

  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为
    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
    
  3. 的物理上不同