@@ -145,6 +145,11 @@ module tinyqv_cpu #(parameter NUM_REGS=16, parameter REG_ADDR_BITS=4) (
145145 wire [3 :0 ] timer_data;
146146 wire is_timer_addr;
147147
148+ wire [3 :0 ] scratch_data;
149+ wire is_scratch_addr;
150+
151+ wire is_internal_addr = is_timer_addr || is_scratch_addr;
152+
148153 reg no_write_in_progress;
149154 reg load_started;
150155 wire stall_core = ! instr_valid || ((is_store || is_load) && ! no_write_in_progress);
@@ -244,7 +249,7 @@ module tinyqv_cpu #(parameter NUM_REGS=16, parameter REG_ADDR_BITS=4) (
244249
245250 if (counter_hi == 3'd0 ) begin
246251 data_ready_latch <= 0 ;
247- if (data_ready_ext || data_ready_latch || is_timer_addr ) begin
252+ if (data_ready_ext || data_ready_latch || is_internal_addr ) begin
248253 data_ready_sync <= 1 ;
249254 end else begin
250255 data_ready_sync <= 0 ;
@@ -257,7 +262,7 @@ module tinyqv_cpu #(parameter NUM_REGS=16, parameter REG_ADDR_BITS=4) (
257262 end
258263 end
259264
260- assign data_ready_core = (counter_hi == 3'd0 ) ? (data_ready_ext || data_ready_latch || is_timer_addr ) : data_ready_sync;
265+ assign data_ready_core = (counter_hi == 3'd0 ) ? (data_ready_ext || data_ready_latch || is_internal_addr ) : data_ready_sync;
261266
262267 always @(posedge clk) begin
263268 if (! rstn) begin
@@ -351,7 +356,8 @@ module tinyqv_cpu #(parameter NUM_REGS=16, parameter REG_ADDR_BITS=4) (
351356 .counter(counter[4 :2 ]),
352357 .pc(pc[counter+:4 ]),
353358 .next_pc(next_pc_for_core[counter+:4 ]),
354- .data_in(is_timer_addr ? timer_data : data_in[counter+:4 ]),
359+ .data_in(is_timer_addr ? timer_data :
360+ is_scratch_addr ? scratch_data : data_in[counter+:4 ]),
355361 .load_data_ready(data_ready_core),
356362
357363 .data_out(data_out_slice),
@@ -462,6 +468,24 @@ module tinyqv_cpu #(parameter NUM_REGS=16, parameter REG_ADDR_BITS=4) (
462468 .timer_interrupt(timer_interrupt)
463469 );
464470
471+ `ifdef NO_SCRATCH
472+ assign is_scratch_addr = 0 ;
473+ assign scratch_data = 0 ;
474+ `else
475+ // Scratch
476+ assign is_scratch_addr = data_addr[27 :12 ] == 16'hffff && data_addr[11 :9 ] == 3'b110 ;
477+ wire [1 :0 ] scratch_write_n = data_write_n | {2 {! is_scratch_addr}};
478+ tinyqv_scratch i_scratch (
479+ .clk(clk),
480+ .rstn(rstn),
481+ .data_addr(address_ready ? addr_out[8 :0 ] : data_addr[8 :0 ]),
482+ .data_write_n(scratch_write_n),
483+ .counter(counter_hi),
484+ .data_in(data_out_slice),
485+ .data_out(scratch_data)
486+ );
487+ `endif
488+
465489 // Debugging
466490 assign debug_instr_complete = instr_complete;
467491 assign debug_instr_valid = instr_valid;
0 commit comments