fetch: jump-unaligned by 4 address waiting support

This commit is contained in:
Zhiyuan Wan
2017-02-12 08:36:41 +08:00
parent df085e362c
commit ae3a363720
7 changed files with 50 additions and 23 deletions

View File

@@ -6,31 +6,31 @@
链结器命令稿和内存映射
LOAD /tmp/ccljpktb.o
LOAD /tmp/ccyHRNCG.o
LOAD /tmp/ccAfohhF.o
LOAD /tmp/ccqZrkCR.o
.memory 0x0000000000000000 0x1b0
0x0000000000000000 . = 0x0
*(.init)
.init 0x0000000000000000 0x10 /tmp/ccljpktb.o
.init 0x0000000000000000 0x10 /tmp/ccAfohhF.o
*(.text)
.text 0x0000000000000010 0x0 /tmp/ccljpktb.o
.text 0x0000000000000010 0x82 /tmp/ccyHRNCG.o
.text 0x0000000000000010 0x0 /tmp/ccAfohhF.o
.text 0x0000000000000010 0x82 /tmp/ccqZrkCR.o
0x0000000000000010 putc
0x0000000000000052 puts
0x0000000000000078 memcpy
*(*)
.data 0x0000000000000092 0x0 /tmp/ccljpktb.o
.bss 0x0000000000000092 0x0 /tmp/ccljpktb.o
.rela.init 0x0000000000000092 0x0 /tmp/ccljpktb.o
.data 0x0000000000000092 0x0 /tmp/ccyHRNCG.o
.bss 0x0000000000000092 0x0 /tmp/ccyHRNCG.o
.text.startup 0x0000000000000092 0x88 /tmp/ccyHRNCG.o
.data 0x0000000000000092 0x0 /tmp/ccAfohhF.o
.bss 0x0000000000000092 0x0 /tmp/ccAfohhF.o
.rela.init 0x0000000000000092 0x0 /tmp/ccAfohhF.o
.data 0x0000000000000092 0x0 /tmp/ccqZrkCR.o
.bss 0x0000000000000092 0x0 /tmp/ccqZrkCR.o
.text.startup 0x0000000000000092 0x88 /tmp/ccqZrkCR.o
0x0000000000000092 main
*fill* 0x000000000000011a 0x2
.rodata.str1.4
0x000000000000011c 0x80 /tmp/ccyHRNCG.o
.comment 0x000000000000019c 0x11 /tmp/ccyHRNCG.o
0x000000000000011c 0x80 /tmp/ccqZrkCR.o
.comment 0x000000000000019c 0x11 /tmp/ccqZrkCR.o
0x12 (松开之前的大小)
0x00000000000001b0 . = ALIGN (0x4)
*fill* 0x00000000000001ad 0x3

View File

@@ -18,7 +18,7 @@
<CWC_FILE/>
</Source_Files>
<TOP_MODULE>
<LABEL/>
<LABEL></LABEL>
<MODULE>top</MODULE>
<CREATEINDEX>auto</CREATEINDEX>
</TOP_MODULE>
@@ -26,6 +26,6 @@
<Current_Step>0</Current_Step>
<SRC-Last-Read/>
<SLC-Last-Read/>
<SDC-Last-Read></SDC-Last-Read>
<SDC-Last-Read/>
</Project_Settings>
</Project>

10
src/csr.txt Normal file
View File

@@ -0,0 +1,10 @@
0x300 MSTATUS: IE[0], PRIV[2:1], CY[3]
0x341 MEPC Storage last pc and jump to interrupt or exception address
0x342 MCAUSE INT[31](it is trigged by an interrupt), Exception op-code[4:0]
0x301 MISA ISA support RV32IMC
0xF11 MVID "ANLG" (Anlogic)
0xF12 MARCHID "ZYKZ" (Zhiyuan Kamikaze)
0xF13 MIMPID "0000" (r0p0)
/* performance counter will not be implemented in this CPU */

View File

@@ -14,7 +14,7 @@ module kamikaze_fetch(clk_i,
input [31:0] im_data_i;
output reg [31:0] instr_o;
output [31:0] im_addr_o;
output reg instr_valid_o;
output instr_valid_o;
output is_compressed_instr_o;
output [31:0] pc_o;
//input stall_i; /* IF 停止信号 */
@@ -34,7 +34,10 @@ module kamikaze_fetch(clk_i,
assign is_compressed_instr_o = is_compressed_instr;
localparam CPU_START = 32'h0; /* 启动地址 */
reg align_wait; /* 对齐等待 */
assign instr_valid_o = !align_wait;
localparam CPU_START = 32'h2; /* 启动地址 */
assign im_addr_o = pc_4[1]? (pc_4 + 2'b10): pc_4; /* 舍入 */
assign stall_requiring = (pc_add_prev == 2) && (pc[1:0] == 2'b00); /* 16位对齐等待防止冲数据 */
@@ -42,29 +45,33 @@ module kamikaze_fetch(clk_i,
assign pc_o = pc;
always @(posedge clk_i or negedge rst_i)
begin
if(!rst_i)
begin
pc_4 <= CPU_START;
pc <= CPU_START;/* PC pc_4 滞后1 CLK */
pc_4 <= {CPU_START[31:2], 2'b00};
pc <= {CPU_START[31:2], 2'b00};/* PC pc_4 滞后1 CLK */
fetch_start <= 0;
pc_add_prev <= 4;
last_instr <= 32'h0;
instr_valid_o <= 0;
align_wait = CPU_START[1];
end
else
begin
if(!stall_i)
begin
begin
if(fetch_start == 1'b0)
begin
fetch_start <= 1'b1; /* 0 指令 */
pc_4 <= pc_4 + 16'h4;
instr_valid_o <= 1;
end
else
begin
if(align_wait)
align_wait <= 0;
pc_4 <= pc_4 + pc_add;
pc <= pc + pc_add;

11
src/int_exp.txt Normal file
View File

@@ -0,0 +1,11 @@
interrupt & exception table:
base_address: IVT_BASE, must be aligned to 4
initial_sp
reset_address
bus_error(misaligned/invalid memory access)
execute_error(divided by zero or illegal instruction)
sys_call(ecall instruction, ebreak will triggers the debugger if it is online)
nmi(not maskable interrupt, it is interrupt 0)
interrupts 1-31

0
src/regfile.v Normal file
View File

View File

@@ -6,7 +6,6 @@ module system_tb;
initial begin
$dumpfile("kamikaze.vcd");
$dumpvars(0, system_tb);
#10 rst = 0;
#15 rst = 1;
#1000 $finish;