System verilog 如何在SystemVerilog中制作可合成指令存储器?

System verilog 如何在SystemVerilog中制作可合成指令存储器?,system-verilog,processor,synthesis,System Verilog,Processor,Synthesis,我正在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

我正在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
模块安装模块
#(
参数大小=7//64
)
(
输入逻辑rst\n,
输入逻辑时钟,
输入逻辑[31:0]地址,
输出逻辑[31:0]rd
);
逻辑[31:0]rom[0:SIZE-1];
分配rd=rom[addr];
初始开始

rom对于Xilinx Vivado,合成指南是Xilinx doc UG901。每个供应商和工具版本将不同。参考合成工具供应商文档以获取指导。例如,我发现了UG901的这个版本。 第4章有一节叫做“ROM HDL编码技术”。这提供了您要求的指导

图中显示的编码样式使用case语句,并将推断4位选择变量“addr”的ROM。 将您自己的值放在=赋值的右侧,而不是图像中列出的值。您应该在示例指定“数据”的位置指定“rom”。图中显示的变量“data”仅使用压缩维度(您的示例有压缩维度和非压缩维度);从“rom”的减速中删除未打包的维度(“[0:SIZE-1]”部分)。另外,更改行“分配rd=rom[addr];”分配rd=rom;使用默认值:rom='0定义所有案例。您可以使用always_comb而不是always@*作为更系统的Verilog方法。它更好,因为在模拟中,always_comb总是在t=0时求值,而always@*则不是

作为制作SystemVerilog ROM的替代方法,使用$readmh(),它将文件读入内存变量“ROM”,如SystemVerilog规范第21.4节“从文件加载内存阵列数据”所示
这里有一个关于$readmh()的不错的教程。

这种方法(使用文件&$readmh())可能需要在项目根处使用符号链接,指向由$readmemh()读取的文件。使用此方法时,使用打包和解包维度定义“rom”变量。在ROM中存储大量数据的情况下,最好使用这种方法。在case语句中维护数十万行并不容易

SystemVerilog综合的一般参考资料是:Stu Sutherland的“使用SystemVerilog进行仿真和综合的RTL建模:使用SystemVerilog进行ASIC和FPGA设计”,这对SystemVerilog(观点)非常有用,重点是综合