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

8

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

就像这样:

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来限制通过端口连接或虚拟接口引用的在接口中声明的对象的访问权限,通过显式列出modport中可访问的对象。但是,不允许在modport中列出的对象仍然可以访问。


Xilinx Vivado不支持参数访问,Altera Quartus也不支持。它们支持$bits(interface.port)的解决方法...然而,在FPGA工具上,接口仍然受到限制,因为modport的支持并不是很好。 - Chiggs
1个回答

3
这里的问题不在于访问权限,而在于需要常量表达式的地方所允许的内容。LRM 并没有很清楚地说明 接口端口引用不被视为分层引用。但是工具并没有对 s.BAR 抱怨,而是对变量 s.data 抱怨。通常情况下,您不能在常量表达式中使用变量,但 LRM 20.6.2 表明

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

因此,$bits(s.data) 应该像参数表达式一样处理。

顺便提一下,您应该使用最新的 免费提供的 IEEE 1800-2012 LRM


实际上,s.BAR和$bits()都没有起作用。所以即使$bits()不起作用,你声称如果我正确理解你的答案,s.BAR应该可以工作。 - AxelOmega
当LRM谈论从接口实例导入类型(typedef)时,它明确提到接口端口引用。出于同样的原因,应该允许通过接口端口传递参数。大多数工具已经支持这一点,但在LRM中并不明确。 - dave_59
@dave_59 很遗憾,很少有(没有?)FPGA工具支持访问接口参数。ASIC的人们玩得开心;) - Chiggs
LRM 对此应该更加明确。但是,如果接口端口应该像普通端口一样行为,并且应该有一种通过接口端口参数访问端口大小 (s.BAR - 现在是非法的分层访问),或通过接口端口信号宽度 ($bits(s.data)) 访问的方法。 - Amal
相关问题:https://verificationacademy.com/forums/systemverilog/access-parameterized-interface-ports-size-within-module - Amal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接