SystemVerilog中Configuration的用法
1. Config
configuration是一套用来描述设计中实例来源的一套显式规则, 它的规则如下:
2. 语法
config < config_name >;
design [< library >.]< cell >
default liblist [{< libraries >}];
cell [< library >.]< cell > liblist [{< libraries >}];
cell [< library >.]< cell > use [< library >.]< cell >[:config];
instance < full_hierarchical_path > liblist [{< libraries >}];
instance < full_hierarchical_path > use [< library >.]< cell >[:config];
endconfig
3. example
lib.map :
library rtlLib *.v; // matches all files in the current directory with a .v suffix
library gateLib ./*.vg; // matches all files in the current directory with a .vg suffix
config cfg1; // specify rtl adder for top.a1, gate-level adder for top.a2
design rtlLib.top;
default liblist rtlLib;
instance top.a2 liblist gateLib;
endconfig
上面就是一个最简单的例子,通过configuration来选择对于某个instance使用哪个module的实现
4. 讲解
一个configuration的基本元素包含:
- config/endconfig
- design
- default + liblist : 这两个通常是一起出现来指定默认搜索库
- instance + liblist: 绑定某个instance到某个库
高级元素包含:
use : 只用于instance和cell后面来指定精确的lib和cell
config bot;
design lib1.bot;
default liblist lib1 lib2;
instance bot.a1 liblist lib3;
endconfig
config top;
design lib1.top;
default liblist lib2 lib1;
instance top.bot use lib1.bot:config;
instance top.bot.a1 liblist lib4; // ERROR - cannot set liblist for top.bot.a1 from this config
cell adder use gateLib.adder;
endconfig
5. 参数设置
adder.sv
module adder #(parameter ID = "id",
W = 8,
D = 512)
(...);
...
$display("ID = %s, W = %d, D = %d", ID, W, D);
...
endmodule: adder
top.sv
module top (...);
parameter WIDTH = 16;
adder a1 (...);
endmodule
module top4 ();
parameter S = 16;
adder a1 #(.ID("a1"))(...);
adder a2 #(.ID("a2"))(...);
adder a3 #(.ID("a3"))(...);
adder a4 #(.ID("a4"))(...);
endmodule
Case 1
config cfgl;
design rtlLib.top;
instance top use #(.WIDTH(32));
instance top.a1 use #(.W(top.WIDTH));
endconfig
输出结果是:
ID = id, W=32, D = 512
Case 2
config cfg2;
localparam S = 24
design rtlLib.top4;
instance top4.a1 use #(.W(top4.S));
instance top4.a2 use #(.W(S));
endconfig
输出结果是:
ID = a1, W=16, D = 512
ID = a2, W=24, D = 512
ID = a3, W=8, D = 512
ID = a4, W=8, D = 512
Case 3
module top5 (...);
parameter WIDTH = 64, DEPTH = 1024, ID = "A1";
adder a1 #(.ID(ID), .W(WIDTH), .D(DEPTH))(...);
endmodule
输出结果是:
ID = A1, W=64, D = 1024
Case 4
config cfg3;
design rtlLib.top5;
instance top5.a1 use #(.W()); // set only parameter W back to its default
endconfig
输出结果是:
ID = A1, W=8, D = 1024
Case 5
config cfg4;
design rtlLib.top;
instance top.a1 use #(); // set all parameters in instance a1
// back to their defaults
endconfig
输出结果是:
ID = id, W=8, D = 512
Case 6
test.sv
module test;
...
top8 t(...);
defparam t.WIDTH = 64;
defparam t.a1.W = 16;
...
endmodule
top8.sv
module top8 (...);
parameter WIDTH = 32;
adder a1 #(.ID("a1")) (...);
adder a2 #(.ID("a2"),.W(WIDTH))(...);
endmodule
adder.sv
module adder #(parameter ID = "id",
W = 8,
D = 512)
(...);
...
$display("ID = %s, W = %d, D = %d", ID, W, D);
...
endmodule
cfg6.sv
config cfg6;
design rtlLib.test;
instance test.t use #(.WIDTH(48));
endconfig
输出结果是:
ID = a1, W=16, D = 512
ID = a2, W=48, D = 512
总结
如果设计中有声明一样,实现不一样的两个模块被不同的模块使用,这个时候Configuration是非常必要的。
虽然各个工具也有各自的方法,但它们毕竟不通用,无法被其他工具使用。所以最好的方法还是使用Configuration.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。