系统verilog参数化接口,如何
system verilog parameterized interfaces, how
嗨,我正在努力让我的头脑围绕接口......起初它们看起来很简单但是一旦我开始使用参数化接口我就无法将各个部分放在一起。
说我有接口
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
);
首先我不知道如何设置我的界面参数
我尝试了以下而不是上面的方法:
my_if(#.H_WIDTH((64), .L_WIDTH(64)) my_if()
和
my_if(#.H_WIDTH((64), .L_WIDTH(64)).in my_if()
不编译...
但是我该如何设置我的界面参数呢?
PLZ 帮助我搜索了很多例子,但它们都很基础。
顺便说一句,解决方案必须综合,因为这不是为了验证
您设置 interface
实例的参数与设置 module
的参数完全相同;当它被实例化时。没有允许您设置接口端口参数的语法。参数值基于实例化模块时连接到端口的接口实例。
当您正在合成的顶层模块有接口端口时,这会出现问题。它类似于顶级模块具有需要覆盖的参数。您需要查看所用工具的综合手册,了解如何手动覆盖参数。
你快到了!在你的顶层模块(你实例化接口的地方),你只需要改变:
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 参数化接口),您应该查看。
实际上这首先是正确的方法
module my_module (
logic input clk,
logic input rst,
my_if.in my_if
);
这个
模块 my_module (
逻辑输入时钟,
逻辑输入第一,
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
在 Synopsys DC 流程中,建议创建一个简化的 SystemVerilog 包装器来覆盖接口和模块参数。
如果您有权访问 Synopsys 文档,请参阅
用于 SystemVerilog 的 HDL 编译器用户指南
自下而上的分层阐述
嗨,我正在努力让我的头脑围绕接口......起初它们看起来很简单但是一旦我开始使用参数化接口我就无法将各个部分放在一起。
说我有接口
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
);
首先我不知道如何设置我的界面参数 我尝试了以下而不是上面的方法:
my_if(#.H_WIDTH((64), .L_WIDTH(64)) my_if()
和
my_if(#.H_WIDTH((64), .L_WIDTH(64)).in my_if()
不编译...
但是我该如何设置我的界面参数呢? PLZ 帮助我搜索了很多例子,但它们都很基础。
顺便说一句,解决方案必须综合,因为这不是为了验证
您设置 interface
实例的参数与设置 module
的参数完全相同;当它被实例化时。没有允许您设置接口端口参数的语法。参数值基于实例化模块时连接到端口的接口实例。
当您正在合成的顶层模块有接口端口时,这会出现问题。它类似于顶级模块具有需要覆盖的参数。您需要查看所用工具的综合手册,了解如何手动覆盖参数。
你快到了!在你的顶层模块(你实例化接口的地方),你只需要改变:
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 参数化接口),您应该查看。
实际上这首先是正确的方法
module my_module (
logic input clk,
logic input rst,
my_if.in my_if
);
这个 模块 my_module ( 逻辑输入时钟, 逻辑输入第一, 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
在 Synopsys DC 流程中,建议创建一个简化的 SystemVerilog 包装器来覆盖接口和模块参数。
如果您有权访问 Synopsys 文档,请参阅
用于 SystemVerilog 的 HDL 编译器用户指南 自下而上的分层阐述