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的支持不是很好,因此接口仍然处于瘫痪状态。