【问题标题】:In SystemVerilog, is it allowed to read a parameter from an interface在 SystemVerilog 中,是否允许从接口读取参数
【发布时间】:2015-04-30 23:21:26
【问题描述】:

我有点困惑,从标准的角度来看,从接口读取参数是否合法。

像这样

interface foo_if #(parameter BAR=5)();
...
logic [BAR-1:0] data;
modport slave(input data, ...);
endinterface

module foobar(foo_if.slave s);
...
logic [s.BAR-1:0] bar;
logic [$bits(s.data)-1:0] m_data;
...
endmodule

我有一个问题,主要的综合工具供应商甚至无法处理这个问题。他们在帮助消息中明确告诉您,不允许将 $bits() 与接口成员一起使用。

但是,其他供应商的模拟工具可以完美地处理这个问题,就像我拥有的​​另一个综合工具一样。

然而,在 S. Sutherland 等人的 SystemVerilog for Design 中。据说:

因为在设计过程中可能还没有完全解决设计层次结构 详细说明,分配参数、specparam 或 localparam 常量 一个从其他地方派生的值 设计层次结构

但是,如果不允许我使用接口中的参数,那真的会削弱接口的实用性。

另一方面,SystemVerilog 1800-2012 标准规定:

25.10 访问接口对象

对接口中声明的对象的访问应由以下人员提供 分层名称引用,无论接口是否 也可以通过端口连接或通过虚拟 接口,并且无论是否存在任何声明的 modports 那个界面。 modport 可用于限制对对象的访问 在通过端口连接引用的接口中声明 或通过显式列出可访问对象的虚拟接口 模组端口。但是,不允许列出的对象 modport 应保持可访问性。

【问题讨论】:

  • Xilinx Vivado 不支持参数访问,Altera Quartus 也不支持。他们确实支持$bits(interface.port) 解决方法...但是接口仍然受到限制,因为 FPGA 工具不太支持 modport。

标签: system-verilog synthesis


【解决方案1】:

这里的问题不是关于访问,而是在需要常量表达式的地方允许什么。接口端口引用的 LRM is not very clear 不被视为分层引用。但是该工具不是在抱怨s.BAR,而是在抱怨s.data,这是一个变量,而不是一个参数。通常,你不能在常量表达式中使用变量,但是 LRM 20.6.2 说

$bits 函数可以用作精化时间常数,当 用于固定大小的数据类型;因此,它可以用于 其他数据类型、变量或网络的声明。

所以 $bits(s.data) 应该被视为参数表达式。

顺便说一句,您应该使用最新的freely available IEEE 1800-2012 LRM

【讨论】:

  • 实际上 s.BAR 或 $bits() 都不起作用。所以即使 $bits() 不工作。您声称如果我正确理解您的答案,s.BAR 应该可以工作。
  • LRM 在谈到从接口实例导入类型 (typedef) 时明确提到了接口端口引用。出于同样的原因,也应该允许通过接口端口的参数。大多数工具已经支持这一点,但在 LRM 中并没有明确说明。
  • @dave_59 遗憾的是,很少(没有?)FPGA 工具支持访问接口参数。 ASIC 的人玩得很开心 ;)
  • LRM 应该更清楚这一点。但是,如果接口端口应该像普通端口一样工作,并且应该有一种方法可以通过接口端口参数访问(s.BAR - 现在是非法分层访问)或通过接口端口来访问端口大小信号宽度($bits(s.data))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多