OpenCores
URL https://opencores.org/ocsvn/amber/amber/trunk

Subversion Repositories amber

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /amber/trunk/hw/vlog/amber25
    from Rev 36 to Rev 39
    Reverse comparison

Rev 36 → Rev 39

/a25_dcache.v
117,16 → 117,13
localparam [3:0] CS_INIT = 4'd0,
CS_IDLE = 4'd1,
CS_FILL0 = 4'd2,
CS_FILL1 = 4'd3,
CS_FILL2 = 4'd4,
CS_FILL3 = 4'd5,
CS_FILL_COMPLETE = 4'd6,
CS_TURN_AROUND = 4'd7,
CS_WRITE_HIT1 = 4'd8,
CS_WRITE_HIT_WAIT_WB = 4'd8,
CS_WRITE_MISS_WAIT_WB = 4'd9,
CS_EX_DELETE = 4'd10;
CS_FILL = 4'd2,
CS_FILL_COMPLETE = 4'd3,
CS_TURN_AROUND = 4'd4,
CS_WRITE_HIT = 4'd5,
CS_WRITE_HIT_WAIT_WB = 4'd6,
CS_WRITE_MISS_WAIT_WB = 4'd7,
CS_EX_DELETE = 4'd8;
 
reg [3:0] c_state = CS_IDLE;
266,11 → 263,11
source_sel <= 1'd1 << C_INVA;
end
else if ( read_miss )
c_state <= CS_FILL3;
c_state <= CS_FILL;
else if ( write_hit )
begin
if ( i_wb_cached_ready )
c_state <= CS_WRITE_HIT1;
c_state <= CS_WRITE_HIT;
else
c_state <= CS_WRITE_HIT_WAIT_WB;
end
279,7 → 276,7
end
CS_FILL3 :
CS_FILL :
// third read of burst of 4
// wb read request asserted, wait for ack
if ( i_wb_cached_ready )
329,7 → 326,7
end
CS_WRITE_HIT1:
CS_WRITE_HIT:
if ( !consecutive_write )
c_state <= CS_IDLE;
 
378,7 → 375,7
 
assign consecutive_write = miss_address[31:4] == i_address[31:4] &&
i_write_enable &&
c_state == CS_WRITE_HIT1 &&
c_state == CS_WRITE_HIT &&
request_pulse;
 
 
388,7 → 385,7
else if ( i_wb_cached_ready && fill_state )
wb_address <= {wb_address[31:4], wb_address[3:2] + 1'd1, 2'd0};
assign fill_state = c_state == CS_FILL0 || c_state == CS_FILL1 || c_state == CS_FILL2 || c_state == CS_FILL3 ;
assign fill_state = c_state == CS_FILL ;
assign wb_hit = i_address == wb_address && i_wb_cached_ready && fill_state;
 
 
531,7 → 528,7
// Need to stall for a write miss to wait for the current wb
// read miss access to complete. Also for a write idle_hit, need
// to stall for 1 cycle while the data cache is being written to
assign write_state = c_state == CS_IDLE || c_state == CS_WRITE_HIT1 ||
assign write_state = c_state == CS_IDLE || c_state == CS_WRITE_HIT ||
c_state == CS_WRITE_HIT_WAIT_WB || c_state == CS_WRITE_MISS_WAIT_WB;
assign write_stall = (write_miss && !(i_wb_cached_ready && write_state)) || (write_hit && !i_wb_cached_ready);
540,7 → 537,7
 
assign cache_busy_stall = c_state == CS_FILL_COMPLETE || c_state == CS_TURN_AROUND || c_state == CS_INIT ||
(fill_state && !rbuf_hit && !wb_hit) ||
(c_state == CS_WRITE_HIT1 && !consecutive_write);
(c_state == CS_WRITE_HIT && !consecutive_write);
 
 
// ======================================
872,18 → 869,15
source_sel[C_INVA] ? "C_INVA" :
"UNKNON" ;
assign xC_STATE = c_state == CS_INIT ? "CS_INIT" :
c_state == CS_IDLE ? "CS_IDLE" :
c_state == CS_FILL0 ? "CS_FILL0" :
c_state == CS_FILL1 ? "CS_FILL1" :
c_state == CS_FILL2 ? "CS_FILL2" :
c_state == CS_FILL3 ? "CS_FILL3" :
c_state == CS_FILL_COMPLETE ? "CS_FILL_COMPLETE" :
c_state == CS_EX_DELETE ? "CS_EX_DELETE" :
c_state == CS_TURN_AROUND ? "CS_TURN_AROUND" :
c_state == CS_WRITE_HIT1 ? "CS_WRITE_HIT1" :
c_state == CS_WRITE_HIT_WAIT_WB ? "CS_WRITE_HIT_WAIT_WB" :
c_state == CS_WRITE_MISS_WAIT_WB ? "CS_WRITE_MISS_WAIT_WB" :
assign xC_STATE = c_state == CS_INIT ? "INIT" :
c_state == CS_IDLE ? "IDLE" :
c_state == CS_FILL ? "FILL" :
c_state == CS_FILL_COMPLETE ? "FILL_COMPLETE" :
c_state == CS_EX_DELETE ? "EX_DELETE" :
c_state == CS_TURN_AROUND ? "TURN_AROUND" :
c_state == CS_WRITE_HIT ? "WRITE_HIT" :
c_state == CS_WRITE_HIT_WAIT_WB ? "WRITE_HIT_WAIT_WB" :
c_state == CS_WRITE_MISS_WAIT_WB ? "WRITE_MISS_WAIT_WB" :
"UNKNOWN" ;
 
 
/a25_wishbone_buf.v
59,7 → 59,7
input [15:0] i_be,
input [31:0] i_addr,
output [127:0] o_rdata,
output o_ready,
output o_ack,
 
// Wishbone side
output o_valid,
76,63 → 76,79
// ----------------------------------------------------
// Signals
// ----------------------------------------------------
reg wbuf_used_r = 'd0;
reg [127:0] wbuf_wdata_r;
reg [31:0] wbuf_addr_r;
reg [15:0] wbuf_be_r;
reg wbuf_write_r = 'd0;
wire in_wreq = i_req && i_write;
reg busy_reading_r = 'd0;
reg [1:0] wbuf_used_r = 'd0;
reg [127:0] wbuf_wdata_r [1:0];
reg [31:0] wbuf_addr_r [1:0];
reg [15:0] wbuf_be_r [1:0];
reg [1:0] wbuf_write_r = 'd0;
reg wbuf_wp_r = 'd0; // write buf write pointer
reg wbuf_rp_r = 'd0; // write buf read pointer
reg busy_reading_r = 'd0;
reg wait_rdata_valid_r = 'd0;
wire in_wreq;
reg ack_owed_r = 'd0;
 
 
// ----------------------------------------------------
// Access Buffer
// ----------------------------------------------------
assign in_wreq = i_req && i_write;
assign push = i_req && !busy_reading_r && (wbuf_used_r == 2'd1 || (wbuf_used_r == 2'd0 && !i_accepted));
assign pop = o_valid && i_accepted && wbuf_used_r != 2'd0;
 
always @(posedge i_clk)
if (i_req && !wbuf_used_r)
if (push && pop)
wbuf_used_r <= wbuf_used_r;
else if (push)
wbuf_used_r <= wbuf_used_r + 1'd1;
else if (pop)
wbuf_used_r <= wbuf_used_r - 1'd1;
 
always @(posedge i_clk)
if (push && in_wreq && !o_ack)
ack_owed_r = 1'd1;
else if (!i_req && o_ack)
ack_owed_r = 1'd0;
always @(posedge i_clk)
if (push)
begin
wbuf_used_r <= !i_accepted;
wbuf_wdata_r <= i_wdata;
wbuf_addr_r <= i_addr;
wbuf_be_r <= i_write ? i_be : 16'hffff;
wbuf_write_r <= i_write;
wbuf_wdata_r [wbuf_wp_r] <= i_wdata;
wbuf_addr_r [wbuf_wp_r] <= i_addr;
wbuf_be_r [wbuf_wp_r] <= i_write ? i_be : 16'hffff;
wbuf_write_r [wbuf_wp_r] <= i_write;
wbuf_wp_r <= !wbuf_wp_r;
end
else if ( i_req && wbuf_used_r && o_valid && i_accepted)
begin
wbuf_used_r <= 1'd1;
wbuf_wdata_r <= i_wdata;
wbuf_addr_r <= i_addr;
wbuf_be_r <= i_write ? i_be : 16'hffff;
wbuf_write_r <= i_write;
end
else if (o_valid && i_accepted && wbuf_write_r)
wbuf_used_r <= 1'd0;
else if (i_rdata_valid && !wbuf_write_r)
wbuf_used_r <= 1'd0;
 
always @(posedge i_clk)
if (pop)
wbuf_rp_r <= !wbuf_rp_r;
 
// ----------------------------------------------------
// Output logic
// ----------------------------------------------------
assign o_wdata = wbuf_used_r ? wbuf_wdata_r : i_wdata;
assign o_write = wbuf_used_r ? wbuf_write_r : i_write;
assign o_addr = wbuf_used_r ? wbuf_addr_r : i_addr;
assign o_be = wbuf_used_r ? wbuf_be_r : i_write ? i_be : 16'hffff;
assign o_wdata = wbuf_used_r != 2'd0 ? wbuf_wdata_r[wbuf_rp_r] : i_wdata;
assign o_write = wbuf_used_r != 2'd0 ? wbuf_write_r[wbuf_rp_r] : i_write;
assign o_addr = wbuf_used_r != 2'd0 ? wbuf_addr_r [wbuf_rp_r] : i_addr;
assign o_be = wbuf_used_r != 2'd0 ? wbuf_be_r [wbuf_rp_r] : i_write ? i_be : 16'hffff;
 
assign o_valid = (wbuf_used_r || i_req) && !busy_reading_r;
assign o_ack = (in_wreq ? (wbuf_used_r == 2'd0) : i_rdata_valid) || (ack_owed_r && pop);
assign o_valid = (wbuf_used_r != 2'd0 || i_req) && !wait_rdata_valid_r;
 
assign o_rdata = i_rdata;
assign o_ready = in_wreq ? (!wbuf_used_r || i_accepted) : i_rdata_valid;
 
 
always@(posedge i_clk)
if (o_valid && !o_write && i_accepted)
if (o_valid && !o_write)
busy_reading_r <= 1'd1;
else if (i_rdata_valid)
busy_reading_r <= 1'd0;
 
 
 
always@(posedge i_clk)
if (o_valid && !o_write && i_accepted)
wait_rdata_valid_r <= 1'd1;
else if (i_rdata_valid)
wait_rdata_valid_r <= 1'd0;
endmodule
 
 
/a25_wishbone.v
64,30 → 64,30
 
// Port 0 - dcache uncached
input i_port0_req,
output o_port0_ack,
input i_port0_write,
input [127:0] i_port0_wdata,
input [15:0] i_port0_be,
input [31:0] i_port0_addr,
output [127:0] o_port0_rdata,
output o_port0_ready,
 
// Port 1 - dcache cached
input i_port1_req,
output o_port1_ack,
input i_port1_write,
input [127:0] i_port1_wdata,
input [15:0] i_port1_be,
input [31:0] i_port1_addr,
output [127:0] o_port1_rdata,
output o_port1_ready,
 
// Port 2 - instruction cache accesses, read only
input i_port2_req,
output o_port2_ack,
input i_port2_write,
input [127:0] i_port2_wdata,
input [15:0] i_port2_be,
input [31:0] i_port2_addr,
output [127:0] o_port2_rdata,
output o_port2_ready,
 
 
// 128-bit Wishbone Bus
130,12 → 130,12
.i_clk ( i_clk ),
 
.i_req ( i_port0_req ),
.o_ack ( o_port0_ack ),
.i_write ( i_port0_write ),
.i_wdata ( i_port0_wdata ),
.i_be ( i_port0_be ),
.i_addr ( i_port0_addr ),
.o_rdata ( o_port0_rdata ),
.o_ready ( o_port0_ready ),
 
.o_valid ( wbuf_valid [0] ),
.i_accepted ( wbuf_accepted [0] ),
152,12 → 152,12
.i_clk ( i_clk ),
 
.i_req ( i_port1_req ),
.o_ack ( o_port1_ack ),
.i_write ( i_port1_write ),
.i_wdata ( i_port1_wdata ),
.i_be ( i_port1_be ),
.i_addr ( i_port1_addr ),
.o_rdata ( o_port1_rdata ),
.o_ready ( o_port1_ready ),
 
.o_valid ( wbuf_valid [1] ),
.i_accepted ( wbuf_accepted [1] ),
174,12 → 174,12
.i_clk ( i_clk ),
 
.i_req ( i_port2_req ),
.o_ack ( o_port2_ack ),
.i_write ( i_port2_write ),
.i_wdata ( i_port2_wdata ),
.i_be ( i_port2_be ),
.i_addr ( i_port2_addr ),
.o_rdata ( o_port2_rdata ),
.o_ready ( o_port2_ready ),
 
.o_valid ( wbuf_valid [2] ),
.i_accepted ( wbuf_accepted [2] ),
/a25_mem.v
68,7 → 68,6
// Wishbone accesses
output o_wb_cached_req, // Cached Request
output o_wb_uncached_req, // Unached Request
output o_wb_qword, // High for a quad-word read request
output o_wb_write, // Read=0, Write=1
output [15:0] o_wb_byte_enable, // byte eable
output [127:0] o_wb_write_data,
150,7 → 149,6
assign o_wb_write_data = {4{i_write_data}};
assign o_wb_cached_req = !cached_wb_stop_r && cached_wb_req;
assign o_wb_uncached_req = !uncached_wb_stop_r && uncached_data_access_p;
assign o_wb_qword = !cached_wb_stop_r && cached_wb_req && !i_write_enable;
 
assign uncached_wb_wait = (o_wb_uncached_req || uncached_wb_req_r) && !i_wb_uncached_ready;
 
/a25_core.v
163,7 → 163,6
wire dcache_wb_cached_req;
wire dcache_wb_uncached_req;
wire dcache_wb_qword;
wire dcache_wb_write;
wire [15:0] dcache_wb_byte_enable;
wire [31:0] dcache_wb_address;
404,7 → 403,6
.o_wb_cached_req ( dcache_wb_cached_req ),
.o_wb_uncached_req ( dcache_wb_uncached_req ),
.o_wb_qword ( dcache_wb_qword ),
.o_wb_write ( dcache_wb_write ),
.o_wb_write_data ( dcache_wb_write_data ),
.o_wb_byte_enable ( dcache_wb_byte_enable ),
447,30 → 445,30
// Port 0 - dcache uncached
.i_port0_req ( dcache_wb_uncached_req ),
.o_port0_ack ( dcache_wb_uncached_ready ),
.i_port0_write ( dcache_wb_write ),
.i_port0_wdata ( dcache_wb_write_data ),
.i_port0_be ( dcache_wb_byte_enable ),
.i_port0_addr ( dcache_wb_address ),
.o_port0_rdata ( dcache_wb_uncached_rdata ),
.o_port0_ready ( dcache_wb_uncached_ready ),
 
// Port 1 - dcache cached
.i_port1_req ( dcache_wb_cached_req ),
.o_port1_ack ( dcache_wb_cached_ready ),
.i_port1_write ( dcache_wb_write ),
.i_port1_wdata ( dcache_wb_write_data ),
.i_port1_be ( dcache_wb_byte_enable ),
.i_port1_addr ( dcache_wb_address ),
.o_port1_rdata ( dcache_wb_cached_rdata ),
.o_port1_ready ( dcache_wb_cached_ready ),
 
// Port 2 - instruction cache accesses, read only
.i_port2_req ( icache_wb_req ),
.o_port2_ack ( icache_wb_ready ),
.i_port2_write ( 1'd0 ),
.i_port2_wdata ( 128'd0 ),
.i_port2_be ( 16'd0 ),
.i_port2_addr ( icache_wb_address ),
.o_port2_rdata ( icache_wb_read_data ),
.o_port2_ready ( icache_wb_ready ),
 
// Wishbone
.o_wb_adr ( o_wb_adr ),

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.