系统verilog参数化接口,如何

时间:2016-07-18 15:44:04

标签: system-verilog

嗨我正在努力让我的脑袋环绕界面......起初它们看起来很简单但是一旦我开始使用参数化界面,我就不能将这些部分放到适当位置。

说我有接口

interface my_if #( 
    parameter H_WIDTH = 64,
    parameter L_WIDTH = 8
);
logic [H_WIDTH -1:0]  a;
logic [L_WIDTH -1:0]  b;
logic                 ready;
modport in ( input a, input b, output valid);
modport out( output a, output b, input ready);
endinterface;

我希望将其用作模块中的端口

module my_module (
logic input clk,
logic input rst,
my_if.in    my_if
);

首先我不知道如何设置我的iterface的参数 我尝试了以下代替上述内容:

my_if(#.H_WIDTH((64), .L_WIDTH(64)) my_if()

my_if(#.H_WIDTH((64), .L_WIDTH(64)).in my_if()

无法编译...

但是如何设置界面的参数呢? PLZ帮助我搜索了大量的例子,但它们都非常基本。

BTW解决方案必须合成,因为这不是用于验证

4 个答案:

答案 0 :(得分:4)

你快到了!在您的顶层模块(实例化界面)中,您只需要更改:

my_if(#.H_WIDTH((64), .L_WIDTH(64)) my_if()

my_if # (.H_WIDTH(64), .L_WIDTH(64)) my_if()

你应该好好去。 IEEE 1800-2012 LRM有一个关于这个主题的部分(25.8参数化接口),你应该检查一下。

答案 1 :(得分:3)

您设置interface实例的参数与设置module参数的方式完全相同;当它被实例化时。没有语法允许您设置接口端口的参数。参数值基于实例化模块时连接到端口的接口实例。

当您要合成的顶级模块具有接口端口时,这会出现问题。它类似于顶级模块具有需要重写的参数。您需要检查所用工具的综合手册,以了解如何手动覆盖参数。

答案 2 :(得分:1)

实际上这是第一个正确的方法

module my_module (
logic input clk,
logic input rst,
my_if.in    my_if
);

此     模块my_module(     逻辑输入clk,     逻辑输入rst,     my_if#(。H_WIDTH(64),. L_WIDTH(64))my_if()     );    显然不合法。

参数设置在接口连接到另一个模块的位置! my_if#(。H_WIDTH(64),. L_WIDTH(64))my_if_()被使用。像这样

module top (
input clk,
input rst
);

my_if # (.H_WIDTH(64), .L_WIDTH(64)) temp();

my_module inst_1
 (
clk           (clk),
rst           (rst),
my_if         (temp_if)
);


 my_module inst_2
 (
clk           (clk),
rst           (rst),
my_if         (temp_if)
);
endmodule

答案 3 :(得分:1)

在Synopsys DC流程中,建议创建一个简化的SystemVerilog包装器来覆盖接口和模块参数。

如果您可以访问Synopsys文档,请参阅

SystemVerilog用户指南的HDL编译器 自下而上的分层次精化