我想创建一个源文件结构,以便我的systemverilog设计中的寄存器偏移量来自整个项目中的一个文件。动机是所有注册火炬都位于一个文件中,可以传递给软件团队。随后,对地址映射的任何更改都只需要更改为一个文件。
目前,我使用名为“address_map.h”的包含文件来定义地址偏移量。此处添加了具有寄存器的所有模块的地址offets。此文件包含在每个模块的声明部分的顶部。这种方法的问题在于,不同模块之间重新定义了相同的参数。我可以通过将偏移量包含在特定于模块的宏中来解决这个问题。但它引入了我不喜欢的语句顺序依赖。例如address_map.h如下所示 -
localparam
REG_ADDR_WIDTH = 8,
REG_DATA_WIDTH = 32,
NUM_OF_REG_REGIONS = 2;
//reg region 1
localparam
MISC_REG_REGION = 0,
MISC_NUM_OF_REG = 4,
MISC_VER_DATE = 0,
MISC_VER_TIME = 1,
MISC_SCRATCH = 2,
MISC_TEMP_SENSE = 3;
//reg region 2
localparam
ADC_REG_REGION = 1,
ADC_NUM_OF_REG = 4,
ADC_VER_DATE = 0,
ADC_VER_TIME = 1,
ADC_SYNC_STAT = 2,
ADC_SYNC_EN = 3,
ADC_OFFSET = 4;
有人知道更好的方法吗?
答案 0 :(得分:3)
另一种选择是使用SystemVerilog package
。有关完整说明,请参阅IEEE std 1800-2012§26。通常,包对于存储和封装共享/公共定义很有用;例如typdefs,静态函数和共享参数。这里使用多包的工作示例http://www.edaplayground.com/s/6/95
更好是主观的。这取决于您(和您的团队)认为更容易管理的内容。您还需要确保您的工具(模拟器,合成器,短绒等)得到适当的支持。例如,edaplayground.com中的iverilog 0.10尚不支持在包中导入包。
package share_pkg;
typedef logic [ 7:0] ADDR_t;
typedef logic [31:0] DATA_t;
localparam NUM_OF_REG_REGIONS = 2;
endpackage
//reg region 1
package region1_pkg;
parameter
REG_REGION = 0,
NUM_OF_REG = 4,
VER_DATE = 0,
VER_TIME = 1,
SCRATCH = 2,
TEMP_SENSE = 3;
endpackage
//reg region 2
package region2_pkg;
localparam
REG_REGION = 1,
NUM_OF_REG = 4,
VER_DATE = 0,
VER_TIME = 2,
SYNC_STAT = 2,
SYNC_EN = 3,
OFFSET = 4;
endpackage