3

我想创建一个源文件结构,以便我的 systemverilog 设计中的寄存器偏移来自整个项目的一个文件。其动机是所有的注册offets都位于一个文件中,可以传递给软件团队。随后,对地址映射的任何更改都只需要更改一个文件。

目前,我使用一个名为“address_map.h”的包含文件,它定义了地址偏移量。此处添加了所有具有寄存器的模块的地址偏移。该文件包含在每个模块的声明部分的顶部。这种方法的问题在于,相同的参数会在不同的模块中重新定义。我可以通过将偏移量包含在特定于模块的宏中来解决这个问题。但它引入了我不喜欢的语句顺序依赖性。例如 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;

有人知道更好的方法吗?

4

1 回答 1

3

另一种选择是使用 SystemVerilog package。有关完整说明,请参阅IEEE std 1800-2012 § 26。一般来说,包对于存储和封装共享/通用定义很有用;例如 typdef、静态函数和共享参数。此处使用多包的工作示例http://www.edaplayground.com/s/6/95

更好是主观的。这取决于您(和您的团队)认为更容易管理的内容。您还需要确保您的工具(模拟器、合成器、linter 等)有适当的支持。例如 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
于 2013-08-21T02:45:37.913 回答