【问题标题】:How to make a synthesizable Instruction Memory in SystemVerilog?如何在 SystemVerilog 中制作可综合的指令内存?
【发布时间】:2021-05-26 08:20:53
【问题描述】:

我正在 SystemVerilog 上设计 MIPS 处理器。指令内存是这样制作的:

   module instr_mem
#(
    parameter SIZE = 7 //64
)
(
    input logic rst_n, 
    input logic clk,
    
    input   logic [31:0] addr,
    output  logic [31:0] rd
);

logic [31:0] rom [0 : SIZE-1];

assign rd = rom[addr];

initial begin
    rom <= {
        32'h0,
        32'h2408000F, // a = F
        32'h240A0000, // res = 0

        32'h01485021, // (*) res = res + a
        32'h2508FFFF, // a = a - 1

        32'h1500FFFD, // if (a != 0) goto (*)
        32'hAC0A0ADD
    };
end

endmodule

但是这段代码不综合作为一个“黑匣子”/单独的模块等,顶部模块看起来像:“核心,数据存储器,”。 我尝试让 IM 组合(assign rom = {..}),但合成方式相同。

如何制作可综合的指令存储器?顺便说一句,是否有任何指南可以编写确定可合成的代码?

【问题讨论】:

    标签: system-verilog processor synthesis


    【解决方案1】:

    对于 Xilinx Vivado,综合指南是 Xilinx doc UG901。每个供应商和工具版本都会有所不同。请咨询综合工具供应商文档以获取指导。举个例子,我找到了这个版本的UG901。 https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_1/ug901-vivado-synthesis.pdf 第 4 章有一节称为“ROM HDL 编码技术”。这提供了您要求的指导。

    图像中显示的编码风格使用 case 语句,并将推断 ROM 用于 4 位选择变量“addr”。 将您自己的值放在 = 分配的 RHS 上,而不是图像中列出的值。您应该在示例分配“数据”的地方分配“rom”。图像中显示的变量“数据”仅使用打包维度(您的示例有打包和解包);从“rom”的减速中消除未压缩的尺寸(“[0 : SIZE-1]”部分)。另外,更改“assign rd = rom[addr];”行'分配rd = rom;使用默认值:rom = '0 定义所有情况。您可以使用 always_comb 而不是 always @* 作为更 SystemVerilog 的方法。它更好,因为 always_comb 在模拟中总是在 t=0 时被评估,而总是 @* 不会。

    作为制作 SystemVerilog ROM 的另一种方法,使用 $readmh(),它将文件读入内存变量“rom”,如 SystemVerilog 规范第 21.4 节“从文件加载内存数组数据”中所示。 https://ieeexplore.ieee.org/document/8299595][3]
    这里有一个关于 $readmh() 的很好的教程。 https://projectf.io/posts/initialize-memory-in-verilog/

    这种方法(使用文件和 $readmh() )可能需要在项目根目录处有一个符号链接,指向 $readmemh() 读取的文件。使用此方法时,使用压缩和未压缩维度定义“rom”变量。如果您有大量数据要存储在 ROM 中,则首选此方法。在 case 语句中维护数十万行并不容易。

    SystemVerilog 综合的一般参考资料是:Stu Sutherland 的“RTL Modeling with SystemVerilog for Simulation and Synthesis:Using SystemVerilog for ASIC and FPGA Design”非常适合 SystemVerilog(观点),重点是综合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多