在systemverilog源代码树中注册一个源文件的偏移量

时间:2013-08-20 21:01:26

标签: design-patterns fpga system-verilog

我想创建一个源文件结构,以便我的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;

有人知道更好的方法吗?

1 个答案:

答案 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