mirror of https://github.com/YosysHQ/picorv32.git
Added hex8tohex32.py script to cxxdemo
This commit is contained in:
parent
c59b0043c4
commit
aa25e426be
|
@ -1,6 +1,7 @@
|
||||||
firmware.d
|
firmware.d
|
||||||
firmware.elf
|
firmware.elf
|
||||||
firmware.hex
|
firmware.hex
|
||||||
|
firmware32.hex
|
||||||
firmware.o
|
firmware.o
|
||||||
syscalls.o
|
syscalls.o
|
||||||
testbench.exe
|
testbench.exe
|
||||||
|
|
|
@ -6,17 +6,18 @@ CCFLAGS = -MD -Os -Wall -std=c++11
|
||||||
LDFLAGS = -Wl,--gc-sections
|
LDFLAGS = -Wl,--gc-sections
|
||||||
LDLIBS = -lstdc++
|
LDLIBS = -lstdc++
|
||||||
|
|
||||||
test: testbench.exe firmware.hex
|
test: testbench.exe firmware32.hex
|
||||||
vvp -N testbench.exe
|
vvp -N testbench.exe
|
||||||
|
|
||||||
testbench.exe: testbench.v ../../picorv32.v
|
testbench.exe: testbench.v ../../picorv32.v
|
||||||
iverilog -o testbench.exe testbench.v ../../picorv32.v
|
iverilog -o testbench.exe testbench.v ../../picorv32.v
|
||||||
chmod -x testbench.exe
|
chmod -x testbench.exe
|
||||||
|
|
||||||
firmware.hex: firmware.elf start.elf
|
firmware32.hex: firmware.elf start.elf hex8tohex32.py
|
||||||
riscv32-unknown-elf-objcopy -O verilog start.elf start.tmp
|
riscv32-unknown-elf-objcopy -O verilog start.elf start.tmp
|
||||||
riscv32-unknown-elf-objcopy -O verilog firmware.elf firmware.tmp
|
riscv32-unknown-elf-objcopy -O verilog firmware.elf firmware.tmp
|
||||||
cat start.tmp firmware.tmp > firmware.hex
|
cat start.tmp firmware.tmp > firmware.hex
|
||||||
|
python3 hex8tohex32.py firmware.hex > firmware32.hex
|
||||||
rm -f start.tmp firmware.tmp
|
rm -f start.tmp firmware.tmp
|
||||||
|
|
||||||
firmware.elf: firmware.o syscalls.o
|
firmware.elf: firmware.o syscalls.o
|
||||||
|
@ -29,7 +30,7 @@ start.elf: start.S start.ld
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o *.d *.tmp start.elf
|
rm -f *.o *.d *.tmp start.elf
|
||||||
rm -f firmware.elf firmware.hex
|
rm -f firmware.elf firmware.hex firmware32.hex
|
||||||
rm -f testbench.exe testbench.vcd
|
rm -f testbench.exe testbench.vcd
|
||||||
|
|
||||||
-include *.d
|
-include *.d
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import fileinput
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
ptr = 0
|
||||||
|
data = []
|
||||||
|
|
||||||
|
def write_data():
|
||||||
|
if len(data) != 0:
|
||||||
|
print("@%08x" % (ptr >> 2))
|
||||||
|
while len(data) % 4 != 0:
|
||||||
|
data.append(0)
|
||||||
|
for word_bytes in zip(*([iter(data)]*4)):
|
||||||
|
print("".join(["%02x" % b for b in reversed(word_bytes)]))
|
||||||
|
|
||||||
|
for line in fileinput.input():
|
||||||
|
if line.startswith("@"):
|
||||||
|
addr = int(line[1:], 16)
|
||||||
|
if addr > ptr+4:
|
||||||
|
write_data()
|
||||||
|
ptr = addr
|
||||||
|
data = []
|
||||||
|
while ptr % 4 != 0:
|
||||||
|
data.append(0)
|
||||||
|
ptr -= 1
|
||||||
|
else:
|
||||||
|
while ptr < addr:
|
||||||
|
data.append(0)
|
||||||
|
ptr += 1
|
||||||
|
else:
|
||||||
|
data += [int(tok, 16) for tok in line.split()]
|
||||||
|
|
||||||
|
write_data()
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
`timescale 1 ns / 1 ps
|
`timescale 1 ns / 1 ps
|
||||||
`undef VERBOSE_MEM
|
`undef VERBOSE_MEM
|
||||||
`undef WRITE_VCD
|
`undef WRITE_VCD
|
||||||
|
`undef MEM8BIT
|
||||||
|
|
||||||
module testbench;
|
module testbench;
|
||||||
reg clk = 1;
|
reg clk = 1;
|
||||||
|
@ -36,8 +37,13 @@ module testbench;
|
||||||
);
|
);
|
||||||
|
|
||||||
localparam MEM_SIZE = 4*1024*1024;
|
localparam MEM_SIZE = 4*1024*1024;
|
||||||
|
`ifdef MEM8BIT
|
||||||
reg [7:0] memory [0:MEM_SIZE-1];
|
reg [7:0] memory [0:MEM_SIZE-1];
|
||||||
initial $readmemh("firmware.hex", memory);
|
initial $readmemh("firmware.hex", memory);
|
||||||
|
`else
|
||||||
|
reg [31:0] memory [0:MEM_SIZE/4-1];
|
||||||
|
initial $readmemh("firmware32.hex", memory);
|
||||||
|
`endif
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
mem_ready <= 0;
|
mem_ready <= 0;
|
||||||
|
@ -46,6 +52,7 @@ module testbench;
|
||||||
mem_rdata <= 'bx;
|
mem_rdata <= 'bx;
|
||||||
case (1)
|
case (1)
|
||||||
mem_addr < MEM_SIZE: begin
|
mem_addr < MEM_SIZE: begin
|
||||||
|
`ifdef MEM8BIT
|
||||||
if (|mem_wstrb) begin
|
if (|mem_wstrb) begin
|
||||||
if (mem_wstrb[0]) memory[mem_addr + 0] <= mem_wdata[ 7: 0];
|
if (mem_wstrb[0]) memory[mem_addr + 0] <= mem_wdata[ 7: 0];
|
||||||
if (mem_wstrb[1]) memory[mem_addr + 1] <= mem_wdata[15: 8];
|
if (mem_wstrb[1]) memory[mem_addr + 1] <= mem_wdata[15: 8];
|
||||||
|
@ -54,6 +61,16 @@ module testbench;
|
||||||
end else begin
|
end else begin
|
||||||
mem_rdata <= {memory[mem_addr+3], memory[mem_addr+2], memory[mem_addr+1], memory[mem_addr]};
|
mem_rdata <= {memory[mem_addr+3], memory[mem_addr+2], memory[mem_addr+1], memory[mem_addr]};
|
||||||
end
|
end
|
||||||
|
`else
|
||||||
|
if (|mem_wstrb) begin
|
||||||
|
if (mem_wstrb[0]) memory[mem_addr >> 2][ 7: 0] <= mem_wdata[ 7: 0];
|
||||||
|
if (mem_wstrb[1]) memory[mem_addr >> 2][15: 8] <= mem_wdata[15: 8];
|
||||||
|
if (mem_wstrb[2]) memory[mem_addr >> 2][23:16] <= mem_wdata[23:16];
|
||||||
|
if (mem_wstrb[3]) memory[mem_addr >> 2][31:24] <= mem_wdata[31:24];
|
||||||
|
end else begin
|
||||||
|
mem_rdata <= memory[mem_addr >> 2];
|
||||||
|
end
|
||||||
|
`endif
|
||||||
end
|
end
|
||||||
mem_addr == 32'h 1000_0000: begin
|
mem_addr == 32'h 1000_0000: begin
|
||||||
$write("%c", mem_wdata[7:0]);
|
$write("%c", mem_wdata[7:0]);
|
||||||
|
|
Loading…
Reference in New Issue