访问层次结构之外的顶级资源

时间:2014-07-05 23:27:50

标签: routing verilog hierarchy synthesize

有没有办法在verilog中合成一个体系结构,这样一个深度嵌套的端点可以访问一些顶级引脚(来自.ucf),而不会明确地将引脚路由到层次结构的每个模块。

在我的情况下,我有一个带有深度嵌套端点的PCIe块。 在端点处有一个地址解码器,需要从顶层的引脚提供一些信号信息。

我宁愿不修改每个介入模块来携带必要的电线。

我的网络搜索很令人沮丧,因为“net”和“bus”这两个术语已经在verilog中具有其他含义。

我尝试过特定的分层命名(例如) top.button和top.LED但是只能成功访问可读引脚,但不能写可写引脚,这让我认为我在这里缺少一些基本的东西。

更新 我可以模拟这个 http://www.edaplayground.com/x/AAq

并且无错误地合成(类似的构造)(Xilinx XST) 但是当它在真实硬件中运行时,LED上没有输出 所以我想知道合成不支持向上名称参考吗?

3 个答案:

答案 0 :(得分:1)

是的,使用一些工具可以实现这一点并且可以合成。我所知道的唯一机制是在函数中使用静态变量来创建“连接”,调用函数一次设置值,一次调用值。

有关此示例,请查看我的proof-of-concept on Github

  

SystemVerilog概念验证,用于在函数内部使用静态变量进行模块之间的通信。

     

这允许在不必通过层次结构添加连线的情况下进行连接。可能的应用包括将信号拉出到逻辑分析仪,写入全局资源(事件日志,统计,UART等)

这在Quartus 13中正确合成,我没有尝试过其他工具,所以YMMV。

更新:Xilinx Vivado目前不支持,有关详细信息,请参阅this thread

答案 1 :(得分:1)

您是否尝试明确命名要访问的引脚的完整分层路径?

例如,假设您的顶层模块实例名称为top,然后您需要访问top的图钉x的层次结构的五个级别并指定它到局部变量y

//At level 5:
assign y = top.x

一些综合工具支持$ top。在这种情况下,您可以尝试:

//At level 5:
assign y = $top().x

这是关于edaplayground.com的一个工作示例(我还没有尝试合成)。

有关详细信息,请参阅Section 23.8 of IEEE 1800-2012中的"向上名称引用"

答案 2 :(得分:-2)

如果在实施时已知,使用SystemVerilog接口Section 3.5 and 25 of IEEE 1800-2012可以解决此问题。

接口是一个命名的网络捆绑包,因此如果路径中的所有内容都连接到接口,则向接口添加额外的网络意味着该接口的所有实例都会获得额外的连接。

向接口添加信号允许使用该总线将低级模块立即连接到其他所有(顶层),一旦通过层次结构连接接口,就无需连接任何其他端口。

Interfaces vs Structs has been discussed previously
A Doulos Tutorial on interfaces

对于稍微更完整的答案,我将25.3.3 IEEE 1800中给出的示例显示给通过接口连接的模块:

// memMod and cpuMod can use any interface
module memMod (interface a, input logic clk);
  ...
endmodule

module cpuMod(interface b, input logic clk);
  ...
endmodule

interface simple_bus; // Define the interface
  logic req, gnt;
  logic [7:0] addr, data;
  logic [1:0] mode;
  logic start, rdy;
endinterface: simple_bus

module top;
  logic clk = 0;

  simple_bus sb_intf(); // Instantiate the interface
  // Reference the sb_intf instance of the simple_bus
  // interface from the generic interfaces of the
  // memMod and cpuMod modules
  memMod mem (.a(sb_intf), .clk(clk));
  cpuMod cpu (.b(sb_intf), .clk(clk));
endmodule

使用modports(Section 25.5 of IEEE 1800)可以指定接口的主从部分来定义端口方向。

Tim提到我避免使用它,因为调试变得非常困难。我曾经在一个大量使用接口的项目上工作过。连接不是一对一的,而是通过层次结构传播到处。想象一下寄存器写入发生在LBUS上,使用WiredOR总线或三态进行回读。我们当时使用的工具不会让你看到哪个模块正在驱动总线。因此,如果它从多个驱动器转移到X,那么它就是一个猜测游戏的原因。

我们并没有将接口仅用于标准协议(如LBUS),而是使用新的接口,这些接口正在被动态更改,这意味着未针对协议更改而修复的模块会损坏总线。使用接口大大加快了实施速度,因为额外的信号可以快速集成。由于无法跟踪界面上的问题来源,因此几乎无法调试成本。