Как запустить собственный шестнадцатеричный файл в ядре ракеты RICSV

Извините, я новичок в RISCV.

Я хотел бы запустить мой шестнадцатеричный файл в процессоре с чипом ракеты, есть ли способ запустить собственную программу в ядре ракеты?

p / s: я не использую шип для имитации, я вместо этого использую модель sim.

Что я сделал до сих пор:

Насколько мне известно, исходное сгенерированное ядро ​​ракеты использует SIMDTM для отладки кода C в память, а затем процессор перейдет в память, чтобы запустить симуляцию программы. (не очень уверен, прав ли я)

Но теперь я хотел бы загрузить свою программу непосредственно в bootrom. Поэтому я закомментирую модуль SIMDTM и изменю bootrom и TLROM чипа ракеты следующим образом: (вместо этого я использую bootrom & TLROM из чипа Sifive freedom)

module BootROM(
input clock,
input oe,
input me,
input [10:0] address,
output [63:0] q
);
reg [63:0] out;
reg [63:0] rom [0:2047];


// 1024 is the maximum length of $readmemh filename supported by Cadence Incisive
reg [1024 * 8 - 1:0] path;

integer i;
initial begin
// `ifdef RANDOMIZE
// `ifdef RANDOMIZE_MEM_INIT
//   for (i = 0; i < 2048; i=i+1) begin
//   rom[i] = {1{$random}};
//  end
// `endif
// `endif
//   if (!$value$plusargs("maskromhex=%s", path)) begin
     $assertoff;
     path =
     "/var/vob/m0720/RiscV/vob/units/RISCV/source/verilog/include/bootrom3.hex";
//   end
$readmemh(path, rom);
end

always @(posedge clock) begin
if (me) begin
 out <= rom[address];
end
end

assign q = oe ? out : 64'bZ;

endmodule



module TLROM_bootrom(

 input         clock,
 input         reset,
 output        auto_in_a_ready,
 input         auto_in_a_valid,
 input  [1:0]  auto_in_a_bits_size,
 input  [8:0]  auto_in_a_bits_source,
 input  [16:0] auto_in_a_bits_address,
 //  output        io_in_0_b_valid,
 input         auto_in_d_ready,
 output        auto_in_d_valid,
 //  output [2:0]  io_in_0_d_bits_opcode,
 //  output [1:0]  io_in_0_d_bits_param,
 output [1:0]  auto_in_d_bits_size,
 output [8:0]  auto_in_d_bits_source,
 //  output        io_in_0_d_bits_sink,
 output [63:0] auto_in_d_bits_data,
 //  output        io_in_0_d_bits_error

 input  [2:0]  auto_in_a_bits_opcode,
 input  [2:0]  auto_in_a_bits_param, 
 input  [7:0]  auto_in_a_bits_mask 


  );
 wire [63:0] rom_q;
 wire  rom_me;
 wire  rom_oe;
 wire [10:0] rom_address;
 wire  rom_clock;
 wire [17:0] _T_61;
 wire [17:0] _T_62;
 wire [16:0] _T_63;
 wire [14:0] _T_64;
 wire [10:0] _T_65;
 wire  _T_67;
 reg  d_full;
 reg [63:0] _RAND_0;
 reg [1:0] d_size;
 reg [63:0] _RAND_1;
 reg [5:0] d_source;
 reg [63:0] _RAND_2;
 reg  _T_74;
 reg [63:0] _RAND_3;
 reg [63:0] _T_76;
 reg [63:0] _RAND_4;
 wire [63:0] _GEN_0;
 wire  _T_77;
 wire  _GEN_1;
 wire  _GEN_2;
 wire  _T_82;
 wire  _T_83;
 wire [1:0] _GEN_3;
 wire [5:0] _GEN_4;
 BootROM rom (
 .q(rom_q),
 .me(rom_me),
 .oe(rom_oe),
 .address(rom_address),
 .clock(rom_clock)
   );

assign auto_in_a_ready = _T_83;
//  assign io_in_0_b_valid = 1'h0;
assign auto_in_d_valid = d_full;
//  assign io_in_0_d_bits_opcode = 3'h1;
// assign io_in_0_d_bits_param = 2'h0;
assign auto_in_d_bits_size = d_size;
assign auto_in_d_bits_source = d_source;
// assign io_in_0_d_bits_sink = 1'h0;
assign auto_in_d_bits_data = _GEN_0;
// assign io_in_0_d_bits_error = 1'h0;
assign rom_me = _T_67;
assign rom_oe = 1'h1;
assign rom_address = _T_65;
assign rom_clock = clock;
assign _T_61 = auto_in_a_bits_address - 17'h10000;
assign _T_62 = $unsigned(_T_61);
assign _T_63 = _T_62[16:0];
assign _T_64 = _T_63[16:2];
assign _T_65 = _T_64[11:1];
assign _T_67 = auto_in_a_ready & auto_in_a_valid;
assign _GEN_0 = _T_74 ? rom_q : _T_76;
assign _T_77 = auto_in_d_ready & auto_in_d_valid;
assign _GEN_1 = _T_77 ? 1'h0 : d_full;
assign _GEN_2 = _T_67 ? 1'h1 : _GEN_1;
assign _T_82 = d_full == 1'h0;
assign _T_83 = auto_in_d_ready | _T_82;
assign _GEN_3 = _T_67 ? auto_in_a_bits_size : d_size;
assign _GEN_4 = _T_67 ? auto_in_a_bits_source : d_source;
`ifdef RANDOMIZE
  integer initvar;
  initial begin
`ifndef verilator
   #0.002 begin end
`endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{$random}};
  d_full = _RAND_0[0:0];
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
  _RAND_1 = {1{$random}};
  d_size = _RAND_1[1:0];
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
  _RAND_2 = {1{$random}};
  d_source = _RAND_2[5:0];
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
  _RAND_3 = {1{$random}};
  _T_74 = _RAND_3[0:0];
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
   _RAND_4 = {1{$random}};
   _T_76 = _RAND_4[63:0];
`endif // RANDOMIZE_REG_INIT
   end
`endif // RANDOMIZE
always @(posedge clock) begin
if (reset) begin
  d_full <= 1'h0;
end else begin
  if (_T_67) begin
    d_full <= 1'h1;
  end else begin
    if (_T_77) begin
      d_full <= 1'h0;
    end
  end
end
if (_T_67) begin
  d_size <= auto_in_a_bits_size;
end
if (_T_67) begin
  d_source <= auto_in_a_bits_source;
end
_T_74 <= _T_67;
if (_T_74) begin
  _T_76 <= rom_q;
 end
end
endmodule

Однако, когда я запускаю симуляцию. В соответствии с моей программой, которую я ожидаю после инициализации bootrom, произойдет чтение и запись по адресу 0x80000000. Однако в симуляции я вижу любые изменения в AXIMem и AXIMem1.

Кто-нибудь знает причину?

Спасибо.

0 ответов

Другие вопросы по тегам