Axe*_*ega 6 synthesis system-verilog
从标准的角度来看,从一个接口读取参数是否合法,我感到有点困惑.
像这样
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
Run Code Online (Sandbox Code Playgroud)
我有一个问题,主要的综合工具供应商甚至无法处理这个问题.并且他们在帮助消息中明确告诉您,不允许将$ bits()与接口成员一起使用.
然而,来自其他供应商的仿真工具完全像我拥有的另一个综合工具一样处理这个问
然而,在S.Sherherland等人的SystemVerilog for Design中.它说:
由于在详细说明期间可能尚未完全解析设计层次结构,因此为参数,specparam或localparam常量指定从设计层次结构中的其他位置派生的值是非法的.
但是,如果不允许我使用接口中的参数,它实际上削弱了接口的有用性.
另一方面,SystemVerilog 1800-2012标准规定:
25.10访问界面对象
无论接口是通过端口连接还是通过虚拟接口访问,并且无论该接口中是否存在任何声明的modport,都可以通过分层名称引用访问接口中声明的对象.modport可用于通过显式列出modport中的可访问对象来限制对通过端口连接或虚拟接口引用的接口中声明的对象的访问.但是,不允许在modport中列出的对象仍然可以访问.
这里的问题不是关于访问,而是在需要常量表达式的地方允许什么。LRM不太清楚接口端口引用不被视为分层引用。但该工具不是在抱怨s.BAR
,它是在抱怨s.data
,它是一个变量,而不是一个参数。通常,你不能在常量表达式中使用变量,但是 LRM 20.6.2 说
当用于固定大小的数据类型时,$bits 函数可以用作精化时间常数;因此,它可以用于其他数据类型、变量或网络的声明。
因此 $bits(s.data) 应该被视为参数表达式。
顺便说一句,您应该使用最新的免费 IEEE 1800-2012 LRM。