Как запустить собственный шестнадцатеричный файл в ядре ракеты 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.
Кто-нибудь знает причину?
Спасибо.