【问题标题】:SyncReadMem generated verilog vs. Rocketchip emitted verilogSyncReadMem 生成的 verilog 与 Rocketchip 发出的 verilog
【发布时间】:2021-02-25 01:59:52
【问题描述】:

我正在使用SyncReadMem() 进行 sram 行为模拟。使用generated Verilog by verilator,我希望将其替换为商业 sram 编译器编译的 verilog,这样我就可以对包括 sram 在内的整个设计进行综合。

但是,我注意到 SyncReadMem() 发出的 verilog 不像 sram emitted in rocketchip 那样具有统一的 IO。我想知道我们如何使用 SyncReadMem() 之类的 chisel mem API 生成一些 sram verilog,就像 Rocketchip 一样?

【问题讨论】:

    标签: chisel


    【解决方案1】:

    您可以使用 Scala FIRRTL 编译器的“替换顺序记忆”传递来黑盒记忆。这正是 Rocket Chip 正在发生的事情。

    请注意,这仅限于仅在内存具有单个读取端口和单个写入端口并且读取延迟为 1 和写入延迟为 1 时才有效。

    例如,考虑以下 1r1w(一读一写)SyncReadMem

    import chisel3._ 
    
    class Foo extends MultiIOModule {
      val read = IO(new Bundle {
        val en = Input(Bool())
        val addr = Input(UInt(8.W))
        val data = Output(UInt(1.W))
      })
      val write = IO(new Bundle{
        val en = Input(Bool())
        val addr = Input(UInt(8.W))
        val data = Input(UInt(1.W))
      })
      val bar = SyncReadMem(256, UInt(1.W))
      
      read.data := bar.read(read.addr, read.en)
      when (write.en) {
        bar.write(write.addr, write.data)
      }
    }
    

    如果您通过运行替换顺序内存传递的请求来编译它:

    (new ChiselStage)
      .emitVerilog(new Foo, Array("--repl-seq-mem", "-c:Foo:-o:Foo.mem.conf"))
    

    这里使用的参数是-c:<circuit>,其中<circuit> 是您要运行的电路的名称,-o:<mem-conf-file> 是要生成的文件的名称,该文件将包含信息(例如,名称、宽度和深度)被黑盒化的记忆。

    你最终会在一个名为 bar_ext 的新模块 bar 中获得内存黑盒:

    module bar(
      input  [7:0] R0_addr,
      input        R0_en,
      input        R0_clk,
      output       R0_data,
      input  [7:0] W0_addr,
      input        W0_en,
      input        W0_clk,
      input        W0_data
    );
      wire [7:0] bar_ext_R0_addr;
      wire  bar_ext_R0_en;
      wire  bar_ext_R0_clk;
      wire  bar_ext_R0_data;
      wire [7:0] bar_ext_W0_addr;
      wire  bar_ext_W0_en;
      wire  bar_ext_W0_clk;
      wire  bar_ext_W0_data;
      bar_ext bar_ext (
        .R0_addr(bar_ext_R0_addr),
        .R0_en(bar_ext_R0_en),
        .R0_clk(bar_ext_R0_clk),
        .R0_data(bar_ext_R0_data),
        .W0_addr(bar_ext_W0_addr),
        .W0_en(bar_ext_W0_en),
        .W0_clk(bar_ext_W0_clk),
        .W0_data(bar_ext_W0_data)
      );
      assign bar_ext_R0_clk = R0_clk;
      assign bar_ext_R0_en = R0_en;
      assign bar_ext_R0_addr = R0_addr;
      assign R0_data = bar_ext_R0_data;
      assign bar_ext_W0_clk = W0_clk;
      assign bar_ext_W0_en = W0_en;
      assign bar_ext_W0_addr = W0_addr;
      assign bar_ext_W0_data = W0_data;
    endmodule
    

    然后,您可以运行内存编译器来使用内存配置文件中的信息并删除输出以代替 bar_ext

    【讨论】:

    • 非常感谢@seldridge,它通过将bar_ext 替换为已编译的sram 二进制库文件来工作。我想知道这个行为 verilog (github.com/chipsalliance/rocket-chip/blob/master/scripts/…) 将如何用于火箭芯片仿真器 (verilator) 模拟?或者如果人们试图在rocketchip verilog上进行vcs模拟,它只是为潜在的vcs verilog模拟发出verilog?
    • 该脚本将输出内存配置文件作为参数(答案为Foo.mem.conf)并生成适用于任何模拟器(如 VCS 或 Verilator)的 Verilog(FPGA 也应该没问题) .如果你真的想把它录下来,你需要使用内存配置文件中的信息运行内存编译器,或者编写一些脚本来为你做这件事,然后用内存编译器输出替换bar_ext
    • 好的。我想通过发出cd emulator \ make 来进行验证器模拟,与这种行为 sram verilog 无关。谢谢。
    • 对不起,让我澄清一下。它用于 Verilator 或 VCS,但如果你有它可以用特定技术替换。为 Rocket Chip 运行 cd emulator && makecd vsim && make 会运行 vlsi_mem_gen 脚本以生成配置文件中标识的 SRAM 的行为模型。 (这显示在 *.behav_srsm.v 文件中。)您可以使用 Verilator 或 VCS 很好地模拟它。此步骤是必要的,因为否则 SRAM 将是未定义的黑盒(由于使用 --repl-seq-mem)。对于流片,应使用特定技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多