我有些困惑,不知道从标准的角度来看,从接口中读取参数是否合法。
就像这样:
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中列出的对象仍然可以访问。
$bits(interface.port)
的解决方法...然而,在FPGA工具上,接口仍然受到限制,因为modport的支持并不是很好。 - Chiggs