System verilog 在SystemVerilog中,是否允许从接口读取参数

System verilog 在SystemVerilog中,是否允许从接口读取参数,system-verilog,synthesis,System Verilog,Synthesis,我有点困惑,从标准的角度来看,从接口读取参数是否合法 像这样 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 我

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

像这样

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访问接口对象

用户可以访问接口中声明的对象 分层名称引用,无论接口是否为 也可通过端口连接或虚拟机进行访问 接口,并且无论在 这个接口。modport可用于限制对对象的访问 在通过端口连接引用的接口中声明 或虚拟接口,在 莫德波特。但是,不允许在列表中列出的对象 modport应保持可访问性


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

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

所以$bits(s.data)应该被当作一个参数表达式来处理


顺便说一句,您应该使用最新版本。

实际上s.BAR和$bits()都不起作用。因此,即使$bits()不起作用。如果我正确理解您的答案,您是在声称s.BAR应该可以工作。LRM在谈到从接口实例导入类型(typedef)时,明确提到了接口端口引用。出于同样的原因,还应允许通过接口端口发送参数。大多数工具已经支持这一点,但在LRM中并不明确。@dave_59遗憾的是,很少(没有?)FPGA工具支持访问接口参数。所有的人都有乐趣;)LRM应该对此更加清楚。但是,如果接口端口的行为与普通端口类似,那么应该有一种方法可以通过接口端口参数访问(s.BAR-现在是非法的分层访问)或通过接口端口信号宽度($bits(s.data))。相关问题:不支持参数访问,Altera Quartus也不支持。它们确实支持
$bits(interface.port)
解决方法。。。然而,由于FPGA工具对ModPort的支持不是很好,因此接口仍然处于瘫痪状态。