2021-03-17 16:24:26 -05:00
|
|
|
module paj_boundtop_hierarchy_no_mem (triIDvalid, triID, wanttriID, raydata, rayaddr, raywe, resultready, resultdata, globalreset, want_braddr, braddr_ready, braddrin, want_brdata, brdata_ready, brdatain, want_addr2, addr2_ready, addr2in, want_data2, data2_ready, data2in, pglobalreset, tm3_clk_v0, tm3_sram_data_in, tm3_sram_data_out, tm3_sram_addr, tm3_sram_we, tm3_sram_oe, tm3_sram_adsp, raygroup01, raygroupvalid01, busy01, raygroup10, raygroupvalid10, busy10, rgData, rgAddr, rgWE, rgAddrValid, rgDone, rgResultData, rgResultReady, rgResultSource, input1);
|
|
|
|
|
|
|
|
|
|
|
|
output triIDvalid;
|
|
|
|
wire triIDvalid;
|
|
|
|
output[15:0] triID;
|
|
|
|
wire[15:0] triID;
|
|
|
|
input wanttriID;
|
|
|
|
output[31:0] raydata;
|
|
|
|
wire[31:0] raydata;
|
|
|
|
output[3:0] rayaddr;
|
|
|
|
wire[3:0] rayaddr;
|
|
|
|
output[2:0] raywe;
|
|
|
|
wire[2:0] raywe;
|
|
|
|
input resultready;
|
|
|
|
input[31:0] resultdata;
|
|
|
|
output globalreset;
|
|
|
|
wire globalreset;
|
|
|
|
output want_braddr;
|
|
|
|
wire want_braddr;
|
|
|
|
input braddr_ready;
|
|
|
|
input[9:0] braddrin;
|
|
|
|
output want_brdata;
|
|
|
|
wire want_brdata;
|
|
|
|
input brdata_ready;
|
|
|
|
input[31:0] brdatain;
|
|
|
|
output want_addr2;
|
|
|
|
wire want_addr2;
|
|
|
|
input addr2_ready;
|
|
|
|
input[17:0] addr2in;
|
|
|
|
output want_data2;
|
|
|
|
wire want_data2;
|
|
|
|
input data2_ready;
|
|
|
|
input[63:0] data2in;
|
|
|
|
input pglobalreset;
|
|
|
|
input tm3_clk_v0;
|
|
|
|
input[63:0] tm3_sram_data_in;
|
|
|
|
wire[63:0] tm3_sram_data_in;
|
|
|
|
output[63:0] tm3_sram_data_out;
|
|
|
|
wire[63:0] tm3_sram_data_out;
|
|
|
|
wire[63:0] tm3_sram_data_xhdl0;
|
|
|
|
output[18:0] tm3_sram_addr;
|
|
|
|
wire[18:0] tm3_sram_addr;
|
|
|
|
output[7:0] tm3_sram_we;
|
|
|
|
wire[7:0] tm3_sram_we;
|
|
|
|
output[1:0] tm3_sram_oe;
|
|
|
|
wire[1:0] tm3_sram_oe;
|
|
|
|
output tm3_sram_adsp;
|
|
|
|
wire tm3_sram_adsp;
|
|
|
|
input[1:0] raygroup01;
|
|
|
|
input raygroupvalid01;
|
|
|
|
output busy01;
|
|
|
|
wire busy01;
|
|
|
|
input[1:0] raygroup10;
|
|
|
|
input raygroupvalid10;
|
|
|
|
output busy10;
|
|
|
|
wire busy10;
|
|
|
|
input[31:0] rgData;
|
|
|
|
input[3:0] rgAddr;
|
|
|
|
input[2:0] rgWE;
|
|
|
|
input rgAddrValid;
|
|
|
|
output rgDone;
|
|
|
|
wire rgDone;
|
|
|
|
output[31:0] rgResultData;
|
|
|
|
wire[31:0] rgResultData;
|
|
|
|
output rgResultReady;
|
|
|
|
wire rgResultReady;
|
|
|
|
output[1:0] rgResultSource;
|
|
|
|
wire[1:0] rgResultSource;
|
|
|
|
input input1;
|
|
|
|
wire raygroupwe;
|
|
|
|
wire raygroupwe01;
|
|
|
|
wire raygroupwe10;
|
|
|
|
wire[1:0] raygroupout;
|
|
|
|
wire[1:0] raygroupout01;
|
|
|
|
wire[1:0] raygroupout10;
|
|
|
|
wire[1:0] raygroupid;
|
|
|
|
wire[1:0] raygroupid01;
|
|
|
|
wire[1:0] raygroupid10;
|
|
|
|
reg[1:0] oldresultid;
|
|
|
|
wire[1:0] resultid;
|
|
|
|
wire[31:0] t1i;
|
|
|
|
wire[31:0] t2i;
|
|
|
|
wire[31:0] t3i;
|
|
|
|
wire[15:0] u1i;
|
|
|
|
wire[15:0] u2i;
|
|
|
|
wire[15:0] u3i;
|
|
|
|
wire[15:0] v1i;
|
|
|
|
wire[15:0] v2i;
|
|
|
|
wire[15:0] v3i;
|
|
|
|
wire[15:0] id1i;
|
|
|
|
wire[15:0] id2i;
|
|
|
|
wire[15:0] id3i;
|
|
|
|
wire hit1i;
|
|
|
|
wire hit2i;
|
|
|
|
wire hit3i;
|
|
|
|
wire newresult;
|
|
|
|
wire write;
|
|
|
|
reg reset;
|
|
|
|
wire reset01;
|
|
|
|
wire reset10;
|
|
|
|
wire[103:0] peekdata;
|
|
|
|
reg[103:0] peeklatch;
|
|
|
|
wire commit01;
|
|
|
|
wire commit10;
|
|
|
|
wire[1:0] baseaddress01;
|
|
|
|
wire[1:0] baseaddress10;
|
|
|
|
wire[1:0] done;
|
|
|
|
wire cntreset;
|
|
|
|
wire cntreset01;
|
|
|
|
wire cntreset10;
|
|
|
|
wire passCTS01;
|
|
|
|
wire passCTS10;
|
|
|
|
wire triIDvalid01;
|
|
|
|
wire triIDvalid10;
|
|
|
|
wire[15:0] triID01;
|
|
|
|
wire[15:0] triID10;
|
|
|
|
reg[9:0] boundNodeID;
|
|
|
|
wire[9:0] BoundNodeID01;
|
|
|
|
wire[9:0] BoundNodeID10;
|
|
|
|
wire enablenear;
|
|
|
|
wire enablenear01;
|
|
|
|
wire enablenear10;
|
|
|
|
wire ack01;
|
|
|
|
wire ack10;
|
|
|
|
wire empty01;
|
|
|
|
wire dataready01;
|
|
|
|
wire empty10;
|
|
|
|
wire dataready10;
|
|
|
|
wire lhreset01;
|
|
|
|
wire lhreset10;
|
|
|
|
wire[9:0] boundnodeIDout01;
|
|
|
|
wire[9:0] boundnodeIDout10;
|
|
|
|
wire[1:0] level01;
|
|
|
|
wire[1:0] level10;
|
|
|
|
wire[2:0] hitmask01;
|
|
|
|
wire[2:0] hitmask10;
|
|
|
|
// Offset Block Ram Read Signals
|
|
|
|
wire[9:0] ostaddr;
|
|
|
|
wire[9:0] addrind01;
|
|
|
|
wire[9:0] addrind10;
|
|
|
|
wire ostaddrvalid;
|
|
|
|
wire addrindvalid01;
|
|
|
|
wire addrindvalid10;
|
|
|
|
wire ostdatavalid;
|
|
|
|
wire[31:0] ostdata;
|
|
|
|
// Tri List Ram Read Signals
|
|
|
|
wire[17:0] tladdr;
|
|
|
|
wire[17:0] tladdr01;
|
|
|
|
wire[17:0] tladdr10;
|
|
|
|
wire tladdrvalid;
|
|
|
|
wire tladdrvalid01;
|
|
|
|
wire tladdrvalid10;
|
|
|
|
wire tldatavalid;
|
|
|
|
wire[63:0] tldata;
|
|
|
|
// Final Result Signals
|
|
|
|
wire[31:0] t1_01;
|
|
|
|
wire[31:0] t2_01;
|
|
|
|
wire[31:0] t3_01;
|
|
|
|
wire[31:0] t1_10;
|
|
|
|
wire[31:0] t2_10;
|
|
|
|
wire[31:0] t3_10;
|
|
|
|
wire[15:0] v1_01;
|
|
|
|
wire[15:0] v2_01;
|
|
|
|
wire[15:0] v3_01;
|
|
|
|
wire[15:0] v1_10;
|
|
|
|
wire[15:0] v2_10;
|
|
|
|
wire[15:0] v3_10;
|
|
|
|
wire[15:0] u1_01;
|
|
|
|
wire[15:0] u2_01;
|
|
|
|
wire[15:0] u3_01;
|
|
|
|
wire[15:0] u1_10;
|
|
|
|
wire[15:0] u2_10;
|
|
|
|
wire[15:0] u3_10;
|
|
|
|
wire[15:0] id1_01;
|
|
|
|
wire[15:0] id2_01;
|
|
|
|
wire[15:0] id3_01;
|
|
|
|
wire[15:0] id1_10;
|
|
|
|
wire[15:0] id2_10;
|
|
|
|
wire[15:0] id3_10;
|
|
|
|
wire hit1_01;
|
|
|
|
wire hit2_01;
|
|
|
|
wire hit3_01;
|
|
|
|
wire hit1_10;
|
|
|
|
wire hit2_10;
|
|
|
|
wire hit3_10;
|
|
|
|
wire bcvalid01;
|
|
|
|
wire bcvalid10;
|
|
|
|
wire[2:0] peekoffset1a;
|
|
|
|
wire[2:0] peekoffset1b;
|
|
|
|
wire[2:0] peekoffset0a;
|
|
|
|
wire[2:0] peekoffset0b;
|
|
|
|
wire[2:0] peekoffset2a;
|
|
|
|
wire[2:0] peekoffset2b;
|
|
|
|
wire[4:0] peekaddressa;
|
|
|
|
wire[4:0] peekaddressb;
|
|
|
|
wire doutput;
|
|
|
|
wire dack;
|
|
|
|
wire[4:0] state01;
|
|
|
|
wire[4:0] state10;
|
|
|
|
wire[2:0] junk1;
|
|
|
|
wire[2:0] junk1b;
|
|
|
|
wire junk2;
|
|
|
|
wire junk2a;
|
|
|
|
wire[1:0] junk3;
|
|
|
|
wire[1:0] junk4;
|
|
|
|
wire[13:0] debugcount01;
|
|
|
|
wire[13:0] debugcount10;
|
|
|
|
wire[1:0] debugsubcount01;
|
|
|
|
wire[1:0] debugsubcount10;
|
|
|
|
wire[2:0] statesram;
|
|
|
|
|
|
|
|
onlyonecycle oc (input1, doutput, pglobalreset, tm3_clk_v0);
|
|
|
|
// Real Stuff Starts Here
|
|
|
|
assign ostaddr = addrind01 | addrind10 ;
|
|
|
|
assign ostaddrvalid = addrindvalid01 | addrindvalid10 ;
|
|
|
|
|
|
|
|
vblockramcontroller offsettable(want_braddr, braddr_ready, braddrin, want_brdata, brdata_ready, brdatain, ostaddr, ostaddrvalid, ostdata, ostdatavalid, pglobalreset, tm3_clk_v0);
|
|
|
|
assign tladdr = tladdr01 | tladdr10 ;
|
|
|
|
assign tladdrvalid = tladdrvalid01 | tladdrvalid10 ;
|
|
|
|
sramcontroller trilist (want_addr2, addr2_ready, addr2in, want_data2, data2_ready, data2in, tladdr, tladdrvalid, tldata, tldatavalid, tm3_sram_data_in, tm3_sram_data_out, tm3_sram_addr, tm3_sram_we, tm3_sram_oe, tm3_sram_adsp, pglobalreset, tm3_clk_v0, statesram);
|
|
|
|
resultinterface ri (t1i, t2i, t3i, u1i, u2i, u3i, v1i, v2i, v3i, id1i, id2i, id3i, hit1i, hit2i, hit3i, resultid, newresult, resultready, resultdata, pglobalreset, tm3_clk_v0);
|
|
|
|
rayinterface rayint (raygroupout, raygroupwe, raygroupid, enablenear, rgData, rgAddr, rgWE, rgAddrValid, rgDone, raydata, rayaddr, raywe, pglobalreset, tm3_clk_v0);
|
|
|
|
boundcontroller boundcont01(raygroupout01, raygroupwe01, raygroupid01, enablenear01, raygroup01, raygroupvalid01, busy01, triIDvalid01, triID01, wanttriID, reset01, baseaddress01, newresult, BoundNodeID01, resultid, hitmask01, dataready01, empty01, level01, boundnodeIDout01, ack01, lhreset01, addrind01, addrindvalid01, ostdata, ostdatavalid, tladdr01, tladdrvalid01, tldata, tldatavalid, t1i, t2i, t3i, u1i, u2i, u3i, v1i, v2i, v3i, id1i, id2i, id3i, hit1i, hit2i, hit3i, t1_01, t2_01, t3_01, u1_01, u2_01, u3_01, v1_01, v2_01, v3_01, id1_01, id2_01, id3_01, hit1_01, hit2_01, hit3_01, bcvalid01, done, cntreset01, passCTS01, passCTS10, pglobalreset, tm3_clk_v0, state01, debugsubcount01, debugcount01);
|
|
|
|
boundcontroller boundcont10(raygroupout10, raygroupwe10, raygroupid10, enablenear10, raygroup10, raygroupvalid10, busy10, triIDvalid10, triID10, wanttriID, reset10, baseaddress10, newresult, BoundNodeID10, resultid, hitmask10, dataready10, empty10, level10, boundnodeIDout10, ack10, lhreset10, addrind10, addrindvalid10, ostdata, ostdatavalid, tladdr10, tladdrvalid10, tldata, tldatavalid, t1i, t2i, t3i, u1i, u2i, u3i, v1i, v2i, v3i, id1i, id2i, id3i, hit1i, hit2i, hit3i, t1_10, t2_10, t3_10, u1_10, u2_10, u3_10, v1_10, v2_10, v3_10, id1_10, id2_10, id3_10, hit1_10, hit2_10, hit3_10, bcvalid10, done, cntreset10, passCTS10, passCTS01, pglobalreset, tm3_clk_v0, state10, debugsubcount10, debugcount01);
|
|
|
|
resulttransmit restransinst (bcvalid01, bcvalid10, id1_01, id2_01, id3_01, id1_10, id2_10, id3_10, hit1_01, hit2_01, hit3_01, hit1_10, hit2_10, hit3_10, u1_01, u2_01, u3_01, v1_01, v2_01, v3_01, u1_10, u2_10, u3_10, v1_10, v2_10, v3_10, rgResultData, rgResultReady, rgResultSource, pglobalreset, tm3_clk_v0);
|
|
|
|
|
|
|
|
assign raygroupout = raygroupout01 | raygroupout10 ;
|
|
|
|
assign raygroupwe = raygroupwe01 | raygroupwe10 ;
|
|
|
|
assign raygroupid = raygroupid01 | raygroupid10 ;
|
|
|
|
assign triIDvalid = triIDvalid01 | triIDvalid10 ;
|
|
|
|
assign enablenear = enablenear01 | enablenear10 ;
|
|
|
|
assign triID = triID01 | triID10 ;
|
|
|
|
assign cntreset = cntreset01 | cntreset10 ;
|
|
|
|
|
|
|
|
// reset <= reset01 or reset10;
|
|
|
|
always @(BoundNodeID01 or BoundNodeID10 or resultid)
|
|
|
|
begin
|
|
|
|
if (resultid == 2'b01)
|
|
|
|
begin
|
|
|
|
boundNodeID = BoundNodeID01 ;
|
|
|
|
end
|
|
|
|
else if (resultid == 2'b10)
|
|
|
|
begin
|
|
|
|
boundNodeID = BoundNodeID10 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
boundNodeID = 10'b0000000000 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
assign write = ((newresult == 1'b1) & (resultid != 0) & ((hit1i == 1'b1) | (hit2i == 1'b1) | (hit3i == 1'b1))) ? 1'b1 : 1'b0 ;
|
|
|
|
|
|
|
|
sortedstack st(t1i, {hit3i, hit2i, hit1i, boundNodeID}, write, reset, peekdata, pglobalreset, tm3_clk_v0);
|
|
|
|
assign commit01 = (done == 2'b01) ? 1'b1 : 1'b0 ;
|
|
|
|
assign commit10 = (done == 2'b10) ? 1'b1 : 1'b0 ;
|
|
|
|
assign dack = doutput | ack01 ;
|
|
|
|
listhandler lh01 (peeklatch, commit01, hitmask01, dack, boundnodeIDout01, level01, empty01, dataready01, lhreset01, pglobalreset, tm3_clk_v0, peekoffset0a, peekoffset1a, peekoffset2a, junk2a, junk4);
|
|
|
|
listhandler lh02 (peeklatch, commit10, hitmask10, ack10, boundnodeIDout10, level10, empty10, dataready10, lhreset10, pglobalreset, tm3_clk_v0, junk1, junk1b, peekoffset2b, junk2, junk3);
|
|
|
|
|
|
|
|
always @(posedge tm3_clk_v0)
|
|
|
|
begin
|
|
|
|
if (pglobalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
peeklatch <= 0;
|
|
|
|
reset <= 1'b0 ;
|
|
|
|
oldresultid <= 2'b00 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
oldresultid <= resultid ;
|
|
|
|
// The reset is only for debugging
|
|
|
|
if (resultid != oldresultid)
|
|
|
|
begin
|
|
|
|
reset <= 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
reset <= 1'b0 ;
|
|
|
|
end
|
|
|
|
if (done != 0)
|
|
|
|
begin
|
|
|
|
peeklatch <= peekdata ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
resultcounter rc (resultid, newresult, done, cntreset, pglobalreset, tm3_clk_v0);
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module resulttransmit (valid01, valid10, id01a, id01b, id01c, id10a, id10b, id10c, hit01a, hit01b, hit01c, hit10a, hit10b, hit10c, u01a, u01b, u01c, v01a, v01b, v01c, u10a, u10b, u10c, v10a, v10b, v10c, rgResultData, rgResultReady, rgResultSource, globalreset, clk);
|
|
|
|
|
|
|
|
input valid01;
|
|
|
|
input valid10;
|
|
|
|
input[15:0] id01a;
|
|
|
|
input[15:0] id01b;
|
|
|
|
input[15:0] id01c;
|
|
|
|
input[15:0] id10a;
|
|
|
|
input[15:0] id10b;
|
|
|
|
input[15:0] id10c;
|
|
|
|
input hit01a;
|
|
|
|
input hit01b;
|
|
|
|
|
|
|
|
input hit01c;
|
|
|
|
input hit10a;
|
|
|
|
input hit10b;
|
|
|
|
input hit10c;
|
|
|
|
input[15:0] u01a;
|
|
|
|
input[15:0] u01b;
|
|
|
|
input[15:0] u01c;
|
|
|
|
input[15:0] v01a;
|
|
|
|
input[15:0] v01b;
|
|
|
|
input[15:0] v01c;
|
|
|
|
input[15:0] u10a;
|
|
|
|
input[15:0] u10b;
|
|
|
|
|
|
|
|
input[15:0] u10c;
|
|
|
|
input[15:0] v10a;
|
|
|
|
input[15:0] v10b;
|
|
|
|
input[15:0] v10c;
|
|
|
|
output[31:0] rgResultData;
|
|
|
|
reg[31:0] rgResultData;
|
|
|
|
output rgResultReady;
|
|
|
|
reg rgResultReady;
|
|
|
|
output[1:0] rgResultSource;
|
|
|
|
reg[1:0] rgResultSource;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
reg[3:0] state;
|
|
|
|
reg[3:0] next_state;
|
|
|
|
|
|
|
|
reg hit01al;
|
|
|
|
reg hit01bl;
|
|
|
|
reg hit01cl;
|
|
|
|
reg hit10al;
|
|
|
|
reg hit10bl;
|
|
|
|
reg hit10cl;
|
|
|
|
reg pending01;
|
|
|
|
reg pending10;
|
|
|
|
reg valid01d;
|
|
|
|
reg valid10d;
|
|
|
|
|
|
|
|
reg[31:0] temp_rgResultData;
|
|
|
|
reg temp_rgResultReady;
|
|
|
|
reg[1:0] temp_rgResultSource;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
pending01 <= 1'b0 ;
|
|
|
|
pending10 <= 1'b0 ;
|
|
|
|
rgResultData <= 32'b00000000000000000000000000000000 ;
|
|
|
|
rgResultSource <= 2'b00 ;
|
|
|
|
|
|
|
|
rgResultReady <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
valid01d <= valid01 ;
|
|
|
|
valid10d <= valid10 ;
|
|
|
|
if (valid01 == 1'b1)
|
|
|
|
begin
|
|
|
|
pending01 <= 1'b1 ;
|
|
|
|
end
|
|
|
|
if (valid01d == 1'b1)
|
|
|
|
begin
|
|
|
|
hit01al <= hit01a ;
|
|
|
|
hit01bl <= hit01b ;
|
|
|
|
hit01cl <= hit01c ;
|
|
|
|
end
|
|
|
|
if (valid10 == 1'b1)
|
|
|
|
begin
|
|
|
|
pending10 <= 1'b1 ;
|
|
|
|
end
|
|
|
|
if (valid10d == 1'b1)
|
|
|
|
begin
|
|
|
|
hit10al <= hit10a ;
|
|
|
|
hit10bl <= hit10b ;
|
|
|
|
hit10cl <= hit10c ;
|
|
|
|
end
|
|
|
|
state <= next_state ;
|
|
|
|
|
|
|
|
rgResultData <= temp_rgResultData;
|
|
|
|
rgResultReady <= temp_rgResultReady;
|
|
|
|
rgResultSource <= temp_rgResultSource;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(state or pending01 or pending10)
|
|
|
|
begin
|
|
|
|
case (state)
|
|
|
|
0 :
|
|
|
|
begin
|
|
|
|
if (pending01 == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else if (pending10 == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 5 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
1 :
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
temp_rgResultData = {id01a, id01b} ;
|
|
|
|
temp_rgResultReady = 1'b1 ;
|
|
|
|
temp_rgResultSource = 2'b01 ;
|
|
|
|
end
|
|
|
|
2 :
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
temp_rgResultData = {13'b0000000000000, hit01al, hit01bl, hit01cl, id01c} ;
|
|
|
|
temp_rgResultReady = 1'b0 ;
|
|
|
|
temp_rgResultSource = 2'b01 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
3 :
|
|
|
|
begin
|
|
|
|
next_state = 4 ;
|
|
|
|
temp_rgResultData = {8'b00000000, u01a[15:8], u01b[15:8], u01c[15:8]} ;
|
|
|
|
temp_rgResultReady = 1'b0 ;
|
|
|
|
temp_rgResultSource = 2'b01 ;
|
|
|
|
end
|
|
|
|
4 :
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_rgResultData = {8'b00000000, v01a[15:8], v01b[15:8], v01c[15:8]} ;
|
|
|
|
temp_rgResultReady = 1'b0 ;
|
|
|
|
temp_rgResultSource = 2'b01 ;
|
|
|
|
end
|
|
|
|
5 :
|
|
|
|
begin
|
|
|
|
next_state = 6 ;
|
|
|
|
temp_rgResultData = {id10a, id10b} ;
|
|
|
|
temp_rgResultReady = 1'b1 ;
|
|
|
|
temp_rgResultSource = 2'b10 ;
|
|
|
|
end
|
|
|
|
6 :
|
|
|
|
begin
|
|
|
|
next_state = 7 ;
|
|
|
|
temp_rgResultData = {13'b0000000000000, hit10al, hit10bl, hit10cl, id10c} ;
|
|
|
|
temp_rgResultReady = 1'b0 ;
|
|
|
|
temp_rgResultSource = 2'b10 ;
|
|
|
|
end
|
|
|
|
7 :
|
|
|
|
begin
|
|
|
|
next_state = 8 ;
|
|
|
|
temp_rgResultData = {8'b00000000, u10a[15:8], u10b[15:8], u10c[15:8]} ;
|
|
|
|
temp_rgResultReady = 1'b0 ;
|
|
|
|
temp_rgResultSource = 2'b10 ;
|
|
|
|
end
|
|
|
|
8 :
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_rgResultData = {8'b00000000, v10a[15:8], v10b[15:8], v10c[15:8]} ;
|
|
|
|
temp_rgResultReady = 1'b0 ;
|
|
|
|
temp_rgResultSource = 2'b10 ;
|
|
|
|
end
|
|
|
|
default:
|
|
|
|
begin
|
|
|
|
temp_rgResultReady = u01a || u01b || u01c || v01a || v01b || v01c || u10a || u10b || u10c || v10a || v10b || v10c;
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module boundcontroller (raygroupout, raygroupwe, raygroupid, enablenear, raygroup, validraygroup, busy, triIDvalid, triID, wanttriID, l0reset, baseaddress, newdata, boundNodeIDout, resultID, hitmask, ldataready, lempty, llevel, lboundNodeID, lack, lhreset, addrind, addrindvalid, dataind, dataindvalid, tladdr, tladdrvalid, tldata, tldatavalid, t1in, t2in, t3in, u1in, u2in, u3in, v1in, v2in, v3in, id1in, id2in, id3in, hit1in, hit2in, hit3in, t1, t2, t3, u1, u2, u3, v1, v2, v3, id1, id2, id3, hit1, hit2, hit3, bcvalid, done, resetcnt, passCTSout, passCTSin, globalreset, clk, statepeek, debugsubcount, debugcount);
|
|
|
|
|
|
|
|
output[1:0] raygroupout;
|
|
|
|
wire[1:0] raygroupout;
|
|
|
|
output raygroupwe;
|
|
|
|
reg raygroupwe;
|
|
|
|
output[1:0] raygroupid;
|
|
|
|
reg[1:0] raygroupid;
|
|
|
|
output enablenear;
|
|
|
|
reg enablenear;
|
|
|
|
input[1:0] raygroup;
|
|
|
|
input validraygroup;
|
|
|
|
output busy;
|
|
|
|
reg busy;
|
|
|
|
reg temp_busy;
|
|
|
|
output triIDvalid;
|
|
|
|
reg triIDvalid;
|
|
|
|
output[15:0] triID;
|
|
|
|
reg[15:0] triID;
|
|
|
|
input wanttriID;
|
|
|
|
output l0reset;
|
|
|
|
reg l0reset;
|
|
|
|
output[1:0] baseaddress;
|
|
|
|
reg[1:0] baseaddress;
|
|
|
|
input newdata;
|
|
|
|
output[9:0] boundNodeIDout;
|
|
|
|
reg[9:0] boundNodeIDout;
|
|
|
|
input[1:0] resultID;
|
|
|
|
output[2:0] hitmask;
|
|
|
|
reg[2:0] hitmask;
|
|
|
|
input ldataready;
|
|
|
|
input lempty;
|
|
|
|
input[1:0] llevel;
|
|
|
|
input[9:0] lboundNodeID;
|
|
|
|
output lack;
|
|
|
|
reg lack;
|
|
|
|
output lhreset;
|
|
|
|
reg lhreset;
|
|
|
|
output[9:0] addrind;
|
|
|
|
reg[9:0] addrind;
|
|
|
|
output addrindvalid;
|
|
|
|
reg addrindvalid;
|
|
|
|
input[31:0] dataind;
|
|
|
|
input dataindvalid;
|
|
|
|
output[17:0] tladdr;
|
|
|
|
reg[17:0] tladdr;
|
|
|
|
output tladdrvalid;
|
|
|
|
reg tladdrvalid;
|
|
|
|
input[63:0] tldata;
|
|
|
|
input tldatavalid;
|
|
|
|
input[31:0] t1in;
|
|
|
|
input[31:0] t2in;
|
|
|
|
input[31:0] t3in;
|
|
|
|
input[15:0] u1in;
|
|
|
|
input[15:0] u2in;
|
|
|
|
input[15:0] u3in;
|
|
|
|
input[15:0] v1in;
|
|
|
|
input[15:0] v2in;
|
|
|
|
input[15:0] v3in;
|
|
|
|
input[15:0] id1in;
|
|
|
|
input[15:0] id2in;
|
|
|
|
input[15:0] id3in;
|
|
|
|
input hit1in;
|
|
|
|
input hit2in;
|
|
|
|
input hit3in;
|
|
|
|
output[31:0] t1;
|
|
|
|
reg[31:0] t1;
|
|
|
|
output[31:0] t2;
|
|
|
|
reg[31:0] t2;
|
|
|
|
output[31:0] t3;
|
|
|
|
reg[31:0] t3;
|
|
|
|
output[15:0] u1;
|
|
|
|
reg[15:0] u1;
|
|
|
|
output[15:0] u2;
|
|
|
|
reg[15:0] u2;
|
|
|
|
output[15:0] u3;
|
|
|
|
reg[15:0] u3;
|
|
|
|
output[15:0] v1;
|
|
|
|
reg[15:0] v1;
|
|
|
|
output[15:0] v2;
|
|
|
|
reg[15:0] v2;
|
|
|
|
output[15:0] v3;
|
|
|
|
reg[15:0] v3;
|
|
|
|
output[15:0] id1;
|
|
|
|
reg[15:0] id1;
|
|
|
|
output[15:0] id2;
|
|
|
|
reg[15:0] id2;
|
|
|
|
output[15:0] id3;
|
|
|
|
reg[15:0] id3;
|
|
|
|
output hit1;
|
|
|
|
reg hit1;
|
|
|
|
output hit2;
|
|
|
|
reg hit2;
|
|
|
|
output hit3;
|
|
|
|
reg hit3;
|
|
|
|
output bcvalid;
|
|
|
|
reg bcvalid;
|
|
|
|
input[1:0] done;
|
|
|
|
output resetcnt;
|
|
|
|
reg resetcnt;
|
|
|
|
output passCTSout;
|
|
|
|
reg passCTSout;
|
|
|
|
input passCTSin;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
output[4:0] statepeek;
|
|
|
|
reg[4:0] statepeek;
|
|
|
|
output[1:0] debugsubcount;
|
|
|
|
wire[1:0] debugsubcount;
|
|
|
|
output[13:0] debugcount;
|
|
|
|
wire[13:0] debugcount;
|
|
|
|
|
|
|
|
reg[4:0] state;
|
|
|
|
reg[4:0] next_state;
|
|
|
|
reg cts;
|
|
|
|
reg[11:0] addr;
|
|
|
|
reg[11:0] startAddr;
|
|
|
|
reg[2:0] resetcount;
|
|
|
|
reg[1:0] raygroupoutl;
|
|
|
|
// Leaf Node Signals
|
|
|
|
reg[13:0] count;
|
|
|
|
reg[63:0] triDatalatch;
|
|
|
|
reg[1:0] subcount;
|
|
|
|
reg[1:0] maskcount;
|
|
|
|
|
|
|
|
reg[4:0] temp_statepeek;
|
|
|
|
reg [1:0]temp_raygroupoutl ;
|
|
|
|
reg temp_cts ;
|
|
|
|
reg temp_passCTSout ;
|
|
|
|
reg [2:0]temp_resetcount ;
|
|
|
|
reg temp_l0reset ;
|
|
|
|
reg [11:0]temp_addr ;
|
|
|
|
reg [11:0]temp_startAddr ;
|
|
|
|
reg [9:0]temp_boundNodeIDout ;
|
|
|
|
reg [1:0]temp_baseaddress ;
|
|
|
|
reg [2:0]temp_hitmask ;
|
|
|
|
reg temp_hit1 ;
|
|
|
|
reg temp_hit2 ;
|
|
|
|
reg temp_hit3 ;
|
|
|
|
reg temp_triIDvalid ;
|
|
|
|
reg [15:0]temp_triID ;
|
|
|
|
reg temp_lack ;
|
|
|
|
reg [9:0]temp_addrind ;
|
|
|
|
reg temp_addrindvalid ;
|
|
|
|
reg temp_tladdrvalid ;
|
|
|
|
reg [17:0]temp_tladdr ;
|
|
|
|
reg [13:0]temp_count ;
|
|
|
|
reg [1:0]temp_subcount ;
|
|
|
|
reg [1:0]temp_maskcount ;
|
|
|
|
reg [63:0]temp_triDatalatch ;
|
|
|
|
reg [31:0]temp_t1 ;
|
|
|
|
reg [15:0]temp_u1 ;
|
|
|
|
reg [15:0]temp_v1 ;
|
|
|
|
reg [15:0]temp_id1 ;
|
|
|
|
reg [31:0]temp_t2 ;
|
|
|
|
reg [15:0]temp_u2 ;
|
|
|
|
reg [15:0]temp_v2 ;
|
|
|
|
reg [15:0]temp_id2 ;
|
|
|
|
reg [31:0]temp_t3 ;
|
|
|
|
reg [15:0]temp_u3 ;
|
|
|
|
reg [15:0]temp_v3 ;
|
|
|
|
reg [15:0]temp_id3 ;
|
|
|
|
|
|
|
|
assign debugsubcount = subcount ;
|
|
|
|
assign debugcount = count ;
|
|
|
|
assign raygroupout = (cts == 1'b1 & state != 8 & state != 19 & state != 1) ? raygroupoutl : 2'b00 ;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
raygroupoutl <= 0;
|
|
|
|
cts <= 1'b0 ;
|
|
|
|
passCTSout <= 1'b0 ;
|
|
|
|
addr <= 0;
|
|
|
|
startAddr <= 0;
|
|
|
|
boundNodeIDout <= 0;
|
|
|
|
resetcount <= 0;
|
|
|
|
hitmask <= 1;
|
|
|
|
lack <= 1'b0 ;
|
|
|
|
baseaddress <= 0;
|
|
|
|
l0reset <= 1'b0 ;
|
|
|
|
resetcnt <= 1'b0 ;
|
|
|
|
triIDvalid <= 1'b0 ;
|
|
|
|
triID <= 0;
|
|
|
|
addrind <= 0;
|
|
|
|
addrindvalid <= 1'b0 ;
|
|
|
|
tladdrvalid <= 1'b0 ;
|
|
|
|
tladdr <= 0;
|
|
|
|
triDatalatch <= 0;
|
|
|
|
maskcount <= 0;
|
|
|
|
subcount <= 0;
|
|
|
|
count <= 0;
|
|
|
|
hit1 <= 1'b0 ;
|
|
|
|
hit2 <= 1'b0 ;
|
|
|
|
hit3 <= 1'b0 ;
|
|
|
|
t1 <= 0;
|
|
|
|
t2 <= 0;
|
|
|
|
t3 <= 0;
|
|
|
|
u1 <= 0;
|
|
|
|
u2 <= 0;
|
|
|
|
u3 <= 0;
|
|
|
|
v1 <= 0;
|
|
|
|
v2 <= 0;
|
|
|
|
v3 <= 0;
|
|
|
|
id1 <= 0;
|
|
|
|
id2 <= 0;
|
|
|
|
id3 <= 0;
|
|
|
|
busy <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
state <= next_state ;
|
|
|
|
busy <= temp_busy;
|
|
|
|
if ((done == 2'b00) | (state == 15 & newdata == 1'b1 & resultID == 2'b00))
|
|
|
|
begin
|
|
|
|
resetcnt <= 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
resetcnt <= 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
statepeek <= temp_statepeek;
|
|
|
|
raygroupoutl <= temp_raygroupoutl ;
|
|
|
|
cts <= temp_cts ;
|
|
|
|
passCTSout <= temp_passCTSout ;
|
|
|
|
resetcount <= temp_resetcount ;
|
|
|
|
l0reset <= temp_l0reset ;
|
|
|
|
addr <= temp_addr ;
|
|
|
|
startAddr <= temp_startAddr ;
|
|
|
|
boundNodeIDout <= temp_boundNodeIDout ;
|
|
|
|
baseaddress <= temp_baseaddress ;
|
|
|
|
hitmask <= temp_hitmask ;
|
|
|
|
hit1 <= temp_hit1 ;
|
|
|
|
hit2 <= temp_hit2 ;
|
|
|
|
hit3 <= temp_hit3 ;
|
|
|
|
triIDvalid <= temp_triIDvalid ;
|
|
|
|
triID <= temp_triID ;
|
|
|
|
lack <= temp_lack ;
|
|
|
|
addrind <= temp_addrind ;
|
|
|
|
addrindvalid <= temp_addrindvalid ;
|
|
|
|
tladdr <= temp_tladdr ;
|
|
|
|
tladdrvalid <= temp_tladdrvalid ;
|
|
|
|
count <= temp_count ;
|
|
|
|
subcount <= temp_subcount ;
|
|
|
|
maskcount <= temp_maskcount ;
|
|
|
|
triDatalatch <= temp_triDatalatch ;
|
|
|
|
t1 <= temp_t1 ;
|
|
|
|
u1 <= temp_u1 ;
|
|
|
|
v1 <= temp_v1 ;
|
|
|
|
id1 <= temp_id1 ;
|
|
|
|
t2 <= temp_t2 ;
|
|
|
|
u2 <= temp_u2 ;
|
|
|
|
v2 <= temp_v2 ;
|
|
|
|
id2 <= temp_id2 ;
|
|
|
|
t3 <= temp_t3 ;
|
|
|
|
u3 <= temp_u3 ;
|
|
|
|
v3 <= temp_v3 ;
|
|
|
|
id3 <= temp_id3 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
always @*
|
|
|
|
begin
|
|
|
|
case (state)
|
|
|
|
0 :
|
|
|
|
begin
|
|
|
|
raygroupid = 0;
|
|
|
|
enablenear = 1'b0 ;
|
|
|
|
raygroupwe = 1'b0 ;
|
|
|
|
bcvalid = 1'b0 ;
|
|
|
|
|
|
|
|
lhreset = 1'b1 ;
|
|
|
|
if (validraygroup == 1'b1 & cts == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (validraygroup == 1'b1 & cts == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
end
|
|
|
|
else if (validraygroup == 1'b0 & passCTSin == 1'b1 & cts == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b00001 ;
|
|
|
|
//
|
|
|
|
temp_raygroupoutl = raygroup ;
|
|
|
|
if (validraygroup == 1'b1 & cts == 1'b0)
|
|
|
|
begin
|
|
|
|
temp_cts = 1'b1 ;
|
|
|
|
temp_passCTSout = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (validraygroup == 1'b0 & cts == 1'b1 & passCTSin == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_cts = 1'b0 ;
|
|
|
|
temp_passCTSout = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
1 :
|
|
|
|
begin
|
|
|
|
if ((passCTSin == cts) & (cts == 1'b1))
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (passCTSin == cts)
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b00010 ;
|
|
|
|
//
|
|
|
|
if (passCTSin == cts)
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
2 :
|
|
|
|
begin
|
|
|
|
if (wanttriID == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b00011 ;
|
|
|
|
//
|
|
|
|
temp_resetcount = 3'b100 ;
|
|
|
|
temp_l0reset = 1'b1 ;
|
|
|
|
temp_addr = 0;
|
|
|
|
temp_startAddr = 0;
|
|
|
|
temp_boundNodeIDout = 0;
|
|
|
|
temp_baseaddress = 0;
|
|
|
|
temp_hitmask = 1;
|
|
|
|
temp_hit1 = 1'b0 ;
|
|
|
|
temp_hit2 = 1'b0 ;
|
|
|
|
temp_hit3 = 1'b0 ;
|
|
|
|
end
|
|
|
|
3 :
|
|
|
|
begin
|
|
|
|
if ((addr - startAddr >= 1) & (addr - startAddr != 49))
|
|
|
|
begin
|
|
|
|
raygroupid = 2'b00 ;
|
|
|
|
end
|
|
|
|
next_state = 4 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
if (resetcount == 5)
|
|
|
|
begin
|
|
|
|
raygroupwe = 1'b1 ;
|
|
|
|
end
|
|
|
|
enablenear = 1'b1 ;
|
|
|
|
temp_statepeek = 5'b00100 ;
|
|
|
|
//
|
|
|
|
if ((addr - startAddr != 48) & (addr - startAddr != 49))
|
|
|
|
begin
|
|
|
|
temp_triIDvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
temp_triID = {4'b0000, addr} ;
|
|
|
|
end
|
|
|
|
4 :
|
|
|
|
begin
|
|
|
|
if (addr - startAddr == 49)
|
|
|
|
begin
|
|
|
|
next_state = 6 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 5 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b00101 ;
|
|
|
|
end
|
|
|
|
5 :
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
|
|
|
|
temp_statepeek = 5'b00111 ;
|
|
|
|
//
|
|
|
|
temp_addr = addr + 1 ;
|
|
|
|
if (resetcount == 5)
|
|
|
|
begin
|
|
|
|
temp_resetcount = 3'b000 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
temp_resetcount = resetcount + 1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
6 :
|
|
|
|
begin
|
|
|
|
if (passCTSin == 1'b1 & cts == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 7;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (done == 2'b00 & cts == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 8;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (done == 2'b00 & cts == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 9;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 6;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01001 ;
|
|
|
|
//
|
|
|
|
if (passCTSin == 1'b1 & cts == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_cts = 1'b0 ;
|
|
|
|
temp_passCTSout = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (done == 2'b00 & cts == 1'b0)
|
|
|
|
begin
|
|
|
|
temp_cts = 1'b1 ;
|
|
|
|
temp_passCTSout = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
7 :
|
|
|
|
begin
|
|
|
|
if (passCTSin == 0)
|
|
|
|
begin
|
|
|
|
next_state = 6;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 7;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01001 ;
|
|
|
|
//
|
|
|
|
if (passCTSin == 1'b0)
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
8 :
|
|
|
|
begin
|
|
|
|
if (passCTSin == 1)
|
|
|
|
begin
|
|
|
|
next_state = 9;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 8 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01010 ;
|
|
|
|
//
|
|
|
|
if (passCTSin == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 1'b0 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
9 :
|
|
|
|
begin
|
|
|
|
if (lempty == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
bcvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (ldataready == 1'b1 & llevel == 2'b10)
|
|
|
|
begin
|
|
|
|
next_state = 10 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (ldataready == 1'b1 & wanttriID == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 9 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01011 ;
|
|
|
|
//
|
|
|
|
temp_resetcount = 3'b100 ;
|
|
|
|
temp_baseaddress = llevel + 1 ;
|
|
|
|
// boundNodeIDout = (lBoundNodeID+1)(6 downto 0) & "000";
|
|
|
|
//boundNodeIDout = {(lboundNodeID + 1)[6:0], 3'b000} ;
|
|
|
|
temp_boundNodeIDout = {lboundNodeID[6:0], 3'b000} ;
|
|
|
|
// temp_addr = (((lBoundNodeID+1)(7 downto 0) & "0000")+
|
|
|
|
// ((lBoundNodeID+1)(6 downto 0) & "00000")) (11 downto 0);
|
|
|
|
//temp_addr = (({(lboundNodeID + 1)[7:0], 4'b0000}) + ({(lboundNodeID + 1)[6:1], 5'b00000}))[11:0] ;
|
|
|
|
temp_addr = (({lboundNodeID[7:0], 4'b0000}) + ({lboundNodeID[6:1], 5'b00000}));
|
|
|
|
// startaddr = (((lBoundNodeID+1)(7 downto 0) & "0000")+
|
|
|
|
// ((lBoundNodeID+1)(6 downto 0) & "00000")) (11 downto 0);
|
|
|
|
//startAddr = (({(lboundNodeID + 1), 4'b0000}) + ({(lboundNodeID + 1), 5'b00000})) ;
|
|
|
|
temp_startAddr = (({lboundNodeID, 4'b0000}) + ({lboundNodeID, 5'b00000})) ;
|
|
|
|
if (ldataready == 1'b1 & (wanttriID == 1'b1 | llevel == 2'b10))
|
|
|
|
begin
|
|
|
|
temp_lack = 1'b1 ;
|
|
|
|
temp_l0reset = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
if (ldataready == 1'b1 & llevel == 2'b10)
|
|
|
|
begin
|
|
|
|
temp_addrind = lboundNodeID - 72 ;
|
|
|
|
temp_addrindvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
10 :
|
|
|
|
begin
|
|
|
|
if (dataindvalid == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 11 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 10 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01100 ;
|
|
|
|
//
|
|
|
|
|
|
|
|
temp_tladdr = dataind[17:0] ;
|
|
|
|
temp_count = dataind[31:18] ;
|
|
|
|
if (dataindvalid == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_addrindvalid = 1'b0 ;
|
|
|
|
temp_tladdrvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
11 :
|
|
|
|
begin
|
|
|
|
if (count == 0 | count == 1)
|
|
|
|
begin
|
|
|
|
next_state = 9 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (wanttriID == 1'b1 & tldatavalid == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 12 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 11 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01101 ;
|
|
|
|
//
|
|
|
|
|
|
|
|
temp_triDatalatch = tldata ;
|
|
|
|
temp_subcount = 2'b10 ;
|
|
|
|
temp_maskcount = 2'b00 ;
|
|
|
|
if ((wanttriID == 1'b1 & tldatavalid == 1'b1) | (count == 0 | count == 1))
|
|
|
|
begin
|
|
|
|
temp_tladdr = tladdr + 1 ;
|
|
|
|
temp_tladdrvalid = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
12 :
|
|
|
|
begin
|
|
|
|
if (count != 0)
|
|
|
|
begin
|
|
|
|
next_state = 13 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 15 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
if (subcount == 2'b01)
|
|
|
|
begin
|
|
|
|
raygroupid = 2'b00 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
raygroupid = 2'b00 ;
|
|
|
|
end
|
|
|
|
enablenear = 1'b0 ;
|
|
|
|
if (subcount == 2'b01 | count == 0)
|
|
|
|
begin
|
|
|
|
raygroupwe = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01110 ;
|
|
|
|
//
|
|
|
|
|
|
|
|
if (maskcount == 2'b11)
|
|
|
|
begin
|
|
|
|
// triID = triDataLatch(15 downto 0);
|
|
|
|
temp_triID = triDatalatch[15:0] ;
|
|
|
|
end
|
|
|
|
else if (maskcount == 2'b10)
|
|
|
|
begin
|
|
|
|
// triID = triDataLatch(31 downto 16);
|
|
|
|
temp_triID = triDatalatch[31:16] ;
|
|
|
|
end
|
|
|
|
else if (maskcount == 2'b01)
|
|
|
|
begin
|
|
|
|
// triID = triDataLatch(47 downto 32);
|
|
|
|
temp_triID = triDatalatch[47:32] ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
// triID = triDataLatch(63 downto 48);
|
|
|
|
temp_triID = triDatalatch[63:48] ;
|
|
|
|
end
|
|
|
|
if (count != 0)
|
|
|
|
begin
|
|
|
|
temp_count = count - 1 ;
|
|
|
|
if (count != 1)
|
|
|
|
begin
|
|
|
|
temp_triIDvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
if (maskcount == 2'b01)
|
|
|
|
begin
|
|
|
|
temp_tladdrvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
13 :
|
|
|
|
begin
|
|
|
|
next_state = 14 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
|
|
|
|
temp_statepeek = 5'b01111 ;
|
|
|
|
end
|
|
|
|
14 :
|
|
|
|
begin
|
|
|
|
next_state = 12 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
temp_statepeek = 5'b10000 ;
|
|
|
|
//
|
|
|
|
|
|
|
|
if (subcount != 0)
|
|
|
|
begin
|
|
|
|
temp_subcount = subcount - 1 ;
|
|
|
|
end
|
|
|
|
if (maskcount == 2'b11)
|
|
|
|
begin
|
|
|
|
temp_tladdr = tladdr + 1 ;
|
|
|
|
temp_tladdrvalid = 1'b0 ;
|
|
|
|
temp_triDatalatch = tldata ;
|
|
|
|
end
|
|
|
|
temp_maskcount = maskcount + 1 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
15 :
|
|
|
|
begin
|
|
|
|
if ((newdata == 1'b0 | resultID != 2'b00) & cts == 1'b1 & passCTSin == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 16 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (newdata == 1'b1 & resultID == 2'b00)
|
|
|
|
begin
|
|
|
|
next_state = 18 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 15 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 5'b10001 ;
|
|
|
|
//
|
|
|
|
temp_tladdr = 0;
|
|
|
|
temp_tladdrvalid = 0;
|
|
|
|
if ((newdata == 0) | (resultID < 2'b00) & (passCTSin == 1))
|
|
|
|
begin
|
|
|
|
temp_cts = 0;
|
|
|
|
temp_passCTSout = 1;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
16 :
|
|
|
|
begin
|
|
|
|
if (newdata == 1'b1 & resultID == 2'b00)
|
|
|
|
begin
|
|
|
|
next_state = 17 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (passCTSin == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 15 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 16 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 5'b10010 ;
|
|
|
|
//
|
|
|
|
if ((passCTSin == 0) & ((newdata == 0) | (resultID == 1)))
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 0;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
17 :
|
|
|
|
begin
|
|
|
|
if (passCTSin == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 18 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 17 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 5'b10011 ;
|
|
|
|
//
|
|
|
|
if (passCTSin == 0)
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 0;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
18 :
|
|
|
|
begin
|
|
|
|
if (cts == 1'b0 & (((hitmask[0]) == 1'b1 & hit1in == 1'b0) | ((hitmask[1]) == 1'b1 & hit2in == 1'b0) | ((hitmask[2]) == 1'b1 & hit3in == 1'b0)))
|
|
|
|
begin
|
|
|
|
next_state = 19 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else if (cts == 1'b1 & (((hitmask[0]) == 1'b1 & hit1in == 1'b0) | ((hitmask[1]) == 1'b1 & hit2in == 1'b0) | ((hitmask[2]) == 1'b1 & hit3in == 1'b0)))
|
|
|
|
begin
|
|
|
|
next_state = 9 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
bcvalid = 1'b1 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 5'b10100 ;
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hit1in == 1'b1 & (hitmask[0]) == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_t1 = t1in;
|
|
|
|
temp_u1 = u1in;
|
|
|
|
temp_v1 = v1in;
|
|
|
|
temp_id1 = id1in;
|
|
|
|
temp_hit1 = 1'b1;
|
|
|
|
temp_hitmask[0] = 1'b0 ;
|
|
|
|
end
|
|
|
|
if (hit2in == 1'b1 & (hitmask[1]) == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_t2 = t2in ;
|
|
|
|
temp_u2 = u2in ;
|
|
|
|
temp_v2 = v2in ;
|
|
|
|
temp_id2 = id2in ;
|
|
|
|
temp_hit2 = 1'b1 ;
|
|
|
|
temp_hitmask[1] = 1'b0 ;
|
|
|
|
end
|
|
|
|
if (hit3in == 1'b1 & (hitmask[2]) == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_t3 = t3in ;
|
|
|
|
temp_u3 = u3in ;
|
|
|
|
temp_v3 = v3in ;
|
|
|
|
temp_id3 = id3in ;
|
|
|
|
temp_hit3 = 1'b1 ;
|
|
|
|
temp_hitmask[2] = 1'b0 ;
|
|
|
|
end
|
|
|
|
if (cts == 1'b0 & (((hitmask[0]) == 1'b1 & hit1in == 1'b0) | ((hitmask[1]) == 1'b1 & hit2in == 1'b0) | ((hitmask[2]) == 1'b1 & hit3in == 1'b0)))
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 1'b1 ;
|
|
|
|
temp_cts = 1'b1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
19 :
|
|
|
|
begin
|
|
|
|
if (passCTSin == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 19 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 9 ;
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 5'b10101 ;
|
|
|
|
//
|
|
|
|
if (passCTSin == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_passCTSout = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// A debugging circuit that allows a single cycle pulse to be
|
|
|
|
// generated by through the ports package
|
|
|
|
module onlyonecycle (trigger, output_xhdl0, globalreset, clk);
|
|
|
|
|
|
|
|
input trigger;
|
|
|
|
output output_xhdl0;
|
|
|
|
reg output_xhdl0;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
reg[1:0] state;
|
|
|
|
reg[1:0] next_state;
|
|
|
|
reg[0:0] count;
|
|
|
|
reg[0:0] temp_count;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
count <= 0 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
state <= next_state ;
|
|
|
|
count <= temp_count;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(state or trigger or count)
|
|
|
|
begin
|
|
|
|
case (state)
|
|
|
|
0 :
|
|
|
|
begin
|
|
|
|
output_xhdl0 = 1'b0 ;
|
|
|
|
if (trigger == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
temp_count = 1 - 1 ;
|
|
|
|
end
|
|
|
|
1 :
|
|
|
|
begin
|
|
|
|
output_xhdl0 = 1'b1 ;
|
|
|
|
if (count == 0)
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
temp_count = count - 1 ;
|
|
|
|
end
|
|
|
|
2 :
|
|
|
|
begin
|
|
|
|
output_xhdl0 = 1'b0 ;
|
|
|
|
if (trigger == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module vblockramcontroller (want_addr, addr_ready, addrin, want_data, data_ready, datain, addr, addrvalid, data, datavalid, globalreset, clk);
|
|
|
|
|
|
|
|
|
|
|
|
output want_addr;
|
|
|
|
reg want_addr;
|
|
|
|
input addr_ready;
|
|
|
|
input[10 - 1:0] addrin;
|
|
|
|
output want_data;
|
|
|
|
reg want_data;
|
|
|
|
input data_ready;
|
|
|
|
input[32 - 1:0] datain;
|
|
|
|
|
|
|
|
input[10 - 1:0] addr;
|
|
|
|
input addrvalid;
|
|
|
|
output[32 - 1:0] data;
|
|
|
|
reg[32 - 1:0] data;
|
|
|
|
output datavalid;
|
|
|
|
reg datavalid;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
reg[2:0] state;
|
|
|
|
reg[2:0] next_state;
|
|
|
|
reg[10 - 1:0] waddr;
|
|
|
|
wire[10 - 1:0] saddr;
|
|
|
|
wire[32 - 1:0] dataout;
|
|
|
|
reg we;
|
|
|
|
reg [32 - 1:0]temp_data;
|
|
|
|
reg [10 - 1:0]temp_waddr ;
|
|
|
|
reg temp_datavalid;
|
|
|
|
|
|
|
|
assign saddr = (state != 0) ? waddr : addr ;
|
|
|
|
|
|
|
|
spramblock ramblock(we, saddr, datain, dataout, clk);
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
waddr <= 0;
|
|
|
|
data <= 0;
|
|
|
|
datavalid <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
|
|
|
|
begin
|
|
|
|
state <= next_state ;
|
|
|
|
data <= temp_data;
|
|
|
|
waddr <= temp_waddr ;
|
|
|
|
datavalid <= temp_datavalid;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(state or addr_ready or data_ready or addrvalid or datavalid)
|
|
|
|
|
|
|
|
begin
|
|
|
|
case (state)
|
|
|
|
0 :
|
|
|
|
begin
|
|
|
|
we = 1'b0 ;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
else if (addrvalid == 1'b1 & datavalid == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 5 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_waddr = addrin ;
|
|
|
|
end
|
|
|
|
if (addrvalid == 1'b0)
|
|
|
|
begin
|
|
|
|
temp_datavalid = 1'b0 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
5 :
|
|
|
|
begin
|
|
|
|
we = 1'b0 ;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
next_state = 0 ;
|
|
|
|
|
|
|
|
temp_data = dataout ;
|
|
|
|
|
|
|
|
temp_datavalid = 1'b1 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
1 :
|
|
|
|
begin
|
|
|
|
we = 1'b0 ;
|
|
|
|
want_addr = 1'b0 ;
|
|
|
|
want_data = 1'b1 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
2 :
|
|
|
|
begin
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b1 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 4 ;
|
|
|
|
end
|
|
|
|
else if (data_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
we = 1'b1 ;
|
|
|
|
|
|
|
|
next_state = 3 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
if (data_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_waddr = waddr + 1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
3 :
|
|
|
|
begin
|
|
|
|
we = 1'b0 ;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
if (data_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
4 :
|
|
|
|
begin
|
|
|
|
we = 1'b0 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
want_addr = 1'b0 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 4 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Single Ported Ram Modual w/Registered Output --
|
|
|
|
// - Synpify should infer ram from the coding style --
|
|
|
|
// - Depth is the number of bits of address --
|
|
|
|
// the true depth is 2**depth --
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
|
|
|
|
//modifying this to black box ram implementation
|
|
|
|
|
|
|
|
|
|
|
|
module spramblock (we, addr, datain, dataout, clk);
|
|
|
|
|
|
|
|
input we;
|
|
|
|
input[10 - 1:0] addr;
|
|
|
|
input[32 - 1:0] datain;
|
|
|
|
output[32 - 1:0] dataout;
|
|
|
|
wire[32 - 1:0] dataout;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
single_port_ram new_ram(
|
|
|
|
.clk (clk),
|
|
|
|
.we(we),
|
|
|
|
.data(datain),
|
|
|
|
.out(dataout),
|
|
|
|
.addr(addr)
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
endmodule
|
|
|
|
|
2021-03-20 22:00:53 -05:00
|
|
|
//---------------------------------------
|
|
|
|
// A single-port 1024x32bit RAM
|
|
|
|
// This module is tuned for VTR's benchmarks
|
|
|
|
//---------------------------------------
|
|
|
|
module single_port_ram (
|
|
|
|
input clk,
|
|
|
|
input we,
|
|
|
|
input [9:0] addr,
|
|
|
|
input [31:0] data,
|
|
|
|
output [31:0] out );
|
|
|
|
|
|
|
|
reg [31:0] ram[1023:0];
|
|
|
|
reg [31:0] internal;
|
|
|
|
|
|
|
|
assign out = internal;
|
|
|
|
|
|
|
|
always @(posedge clk) begin
|
|
|
|
if(wen) begin
|
|
|
|
ram[addr] <= data;
|
|
|
|
end
|
|
|
|
|
|
|
|
if(ren) begin
|
|
|
|
internal <= ram[addr];
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
endmodule
|
2021-03-17 16:24:26 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module sramcontroller (want_addr, addr_ready, addrin, want_data, data_ready, datain, addr, addrvalid, data, datavalid, tm3_sram_data_in, tm3_sram_data_out, tm3_sram_addr, tm3_sram_we, tm3_sram_oe, tm3_sram_adsp, globalreset, clk, statepeek);
|
|
|
|
|
|
|
|
output want_addr;
|
|
|
|
reg want_addr;
|
|
|
|
input addr_ready;
|
|
|
|
input[17:0] addrin;
|
|
|
|
output want_data;
|
|
|
|
reg want_data;
|
|
|
|
input data_ready;
|
|
|
|
input[63:0] datain;
|
|
|
|
input[17:0] addr;
|
|
|
|
input addrvalid;
|
|
|
|
|
|
|
|
output[63:0] data;
|
|
|
|
reg[63:0] data;
|
|
|
|
reg[63:0] temp_data;
|
|
|
|
output datavalid;
|
|
|
|
reg datavalid;
|
|
|
|
reg temp_datavalid;
|
|
|
|
input[63:0] tm3_sram_data_in;
|
|
|
|
wire[63:0] tm3_sram_data_in;
|
|
|
|
output[63:0] tm3_sram_data_out;
|
|
|
|
wire[63:0] tm3_sram_data_out;
|
|
|
|
reg[63:0] tm3_sram_data_xhdl0;
|
|
|
|
output[18:0] tm3_sram_addr;
|
|
|
|
reg[18:0] tm3_sram_addr;
|
|
|
|
output[7:0] tm3_sram_we;
|
|
|
|
reg[7:0] tm3_sram_we;
|
|
|
|
output[1:0] tm3_sram_oe;
|
|
|
|
|
|
|
|
reg[1:0] tm3_sram_oe;
|
|
|
|
output tm3_sram_adsp;
|
|
|
|
reg tm3_sram_adsp;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
output[2:0] statepeek;
|
|
|
|
reg[2:0] statepeek;
|
|
|
|
reg[2:0] temp_statepeek;
|
|
|
|
|
|
|
|
reg[2:0] state;
|
|
|
|
reg[2:0] next_state;
|
|
|
|
reg[17:0] waddress;
|
|
|
|
reg[17:0] temp_waddress;
|
|
|
|
|
|
|
|
assign tm3_sram_data_out = tm3_sram_data_xhdl0;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
waddress <= 0;
|
|
|
|
data <= 0;
|
|
|
|
datavalid <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
state <= next_state ;
|
|
|
|
statepeek <= temp_statepeek;
|
|
|
|
data <=temp_data;
|
|
|
|
datavalid <=temp_datavalid;
|
|
|
|
waddress <= temp_waddress;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(state or addr_ready or data_ready or waddress or datain or addrvalid or
|
|
|
|
datavalid or addr)
|
|
|
|
begin
|
|
|
|
case (state)
|
|
|
|
0 :
|
|
|
|
begin
|
|
|
|
tm3_sram_we = 8'b11111111 ;
|
|
|
|
tm3_sram_data_xhdl0 = 0;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else if (addrvalid == 1'b1 & datavalid == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 5 ;
|
|
|
|
|
|
|
|
tm3_sram_addr = {1'b0, addr} ;
|
|
|
|
tm3_sram_adsp = 1'b0 ;
|
|
|
|
tm3_sram_oe = 2'b01 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 3'b001 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_waddress = addrin ;
|
|
|
|
end
|
|
|
|
if (addrvalid == 1'b0)
|
|
|
|
begin
|
|
|
|
temp_datavalid = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
1 :
|
|
|
|
begin
|
|
|
|
tm3_sram_we = 8'b11111111 ;
|
|
|
|
tm3_sram_oe = 2'b11 ;
|
|
|
|
tm3_sram_adsp = 1'b1 ;
|
|
|
|
tm3_sram_data_xhdl0 = 0;
|
|
|
|
tm3_sram_addr = 0;
|
|
|
|
want_addr = 1'b0 ;
|
|
|
|
want_data = 1'b1 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
temp_statepeek = 3'b010 ;
|
|
|
|
end
|
|
|
|
2 :
|
|
|
|
begin
|
|
|
|
tm3_sram_oe = 2'b11 ;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b1 ;
|
|
|
|
tm3_sram_addr = {1'b0, waddress} ;
|
|
|
|
tm3_sram_data_xhdl0 = datain ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 4 ;
|
|
|
|
end
|
|
|
|
else if (data_ready == 1'b1)
|
|
|
|
begin
|
|
|
|
|
|
|
|
tm3_sram_we = 8'b00000000 ;
|
|
|
|
tm3_sram_adsp = 1'b0 ;
|
|
|
|
next_state = 3 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 3'b011 ;
|
|
|
|
if (data_ready == 1'b1)
|
|
|
|
|
|
|
|
begin
|
|
|
|
temp_waddress = waddress + 1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
3 :
|
|
|
|
begin
|
|
|
|
tm3_sram_we = 8'b11111111 ;
|
|
|
|
tm3_sram_oe = 2'b11 ;
|
|
|
|
tm3_sram_adsp = 1'b1 ;
|
|
|
|
tm3_sram_data_xhdl0 = 0;
|
|
|
|
tm3_sram_addr = 0;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
if (data_ready == 1'b1)
|
|
|
|
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 3'b100 ;
|
|
|
|
end
|
|
|
|
4 :
|
|
|
|
begin
|
|
|
|
tm3_sram_we = 8'b11111111 ;
|
|
|
|
tm3_sram_oe = 2'b11 ;
|
|
|
|
tm3_sram_adsp = 1'b1 ;
|
|
|
|
tm3_sram_data_xhdl0 = 0;
|
|
|
|
tm3_sram_addr = 0;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
want_addr = 1'b0 ;
|
|
|
|
if (addr_ready == 1'b1)
|
|
|
|
|
|
|
|
begin
|
|
|
|
next_state = 4 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
temp_statepeek = 3'b101 ;
|
|
|
|
end
|
|
|
|
5 :
|
|
|
|
begin
|
|
|
|
tm3_sram_we = 8'b11111111 ;
|
|
|
|
tm3_sram_oe = 2'b11 ;
|
|
|
|
tm3_sram_adsp = 1'b1 ;
|
|
|
|
tm3_sram_data_xhdl0 = 0;
|
|
|
|
tm3_sram_addr = 0;
|
|
|
|
want_addr = 1'b1 ;
|
|
|
|
want_data = 1'b0 ;
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_statepeek = 3'b110 ;
|
|
|
|
temp_data = tm3_sram_data_in ;
|
|
|
|
temp_datavalid = 1'b1 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module resultinterface (t1b, t2b, t3b, u1b, u2b, u3b, v1b, v2b, v3b, id1b, id2b, id3b, hit1b, hit2b, hit3b, resultID, newdata, resultready, resultdata, globalreset, clk);
|
|
|
|
|
|
|
|
output[31:0] t1b;
|
|
|
|
reg[31:0] t1b;
|
|
|
|
output[31:0] t2b;
|
|
|
|
reg[31:0] t2b;
|
|
|
|
output[31:0] t3b;
|
|
|
|
reg[31:0] t3b;
|
|
|
|
output[15:0] u1b;
|
|
|
|
reg[15:0] u1b;
|
|
|
|
output[15:0] u2b;
|
|
|
|
reg[15:0] u2b;
|
|
|
|
|
|
|
|
output[15:0] u3b;
|
|
|
|
reg[15:0] u3b;
|
|
|
|
output[15:0] v1b;
|
|
|
|
reg[15:0] v1b;
|
|
|
|
output[15:0] v2b;
|
|
|
|
reg[15:0] v2b;
|
|
|
|
output[15:0] v3b;
|
|
|
|
reg[15:0] v3b;
|
|
|
|
output[15:0] id1b;
|
|
|
|
reg[15:0] id1b;
|
|
|
|
output[15:0] id2b;
|
|
|
|
reg[15:0] id2b;
|
|
|
|
|
|
|
|
output[15:0] id3b;
|
|
|
|
reg[15:0] id3b;
|
|
|
|
output hit1b;
|
|
|
|
reg hit1b;
|
|
|
|
output hit2b;
|
|
|
|
reg hit2b;
|
|
|
|
output hit3b;
|
|
|
|
reg hit3b;
|
|
|
|
output[1:0] resultID;
|
|
|
|
reg[1:0] resultID;
|
|
|
|
output newdata;
|
|
|
|
reg newdata;
|
|
|
|
|
|
|
|
reg[31:0] temp_t1b;
|
|
|
|
reg[31:0] temp_t2b;
|
|
|
|
reg[31:0] temp_t3b;
|
|
|
|
reg[15:0] temp_u1b;
|
|
|
|
reg[15:0] temp_u2b;
|
|
|
|
reg[15:0] temp_u3b;
|
|
|
|
reg[15:0] temp_v1b;
|
|
|
|
reg[15:0] temp_v2b;
|
|
|
|
reg[15:0] temp_v3b;
|
|
|
|
reg[15:0] temp_id1b;
|
|
|
|
reg[15:0] temp_id2b;
|
|
|
|
reg[15:0] temp_id3b;
|
|
|
|
reg temp_hit1b;
|
|
|
|
reg temp_hit2b;
|
|
|
|
reg temp_hit3b;
|
|
|
|
reg[1:0] temp_resultID;
|
|
|
|
reg temp_newdata;
|
|
|
|
|
|
|
|
input resultready;
|
|
|
|
input[31:0] resultdata;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
reg[3:0] state;
|
|
|
|
reg[3:0] next_state;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
t1b <= 0;
|
|
|
|
t2b <= 0;
|
|
|
|
t3b <= 0;
|
|
|
|
u1b <= 0;
|
|
|
|
u2b <= 0;
|
|
|
|
u3b <= 0;
|
|
|
|
v1b <= 0;
|
|
|
|
|
|
|
|
v2b <= 0;
|
|
|
|
v3b <= 0;
|
|
|
|
id1b <= 0;
|
|
|
|
id2b <= 0;
|
|
|
|
id3b <= 0;
|
|
|
|
hit1b <= 1'b0 ;
|
|
|
|
hit2b <= 1'b0 ;
|
|
|
|
hit3b <= 1'b0 ;
|
|
|
|
resultID <= 0;
|
|
|
|
newdata <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
state <= next_state ;
|
|
|
|
|
|
|
|
t1b <= temp_t1b;
|
|
|
|
newdata <= temp_newdata;
|
|
|
|
u1b <= temp_u1b;
|
|
|
|
v1b <= temp_v1b;
|
|
|
|
id1b <= temp_id1b;
|
|
|
|
hit1b <= temp_hit1b;
|
|
|
|
resultID <= temp_resultID;
|
|
|
|
t2b <= temp_t2b;
|
|
|
|
u2b <= temp_u2b;
|
|
|
|
id2b <= temp_id2b;
|
|
|
|
t3b <= temp_t3b;
|
|
|
|
u3b <= temp_u3b;
|
|
|
|
v3b <= temp_v3b;
|
|
|
|
id3b <= temp_id3b;
|
|
|
|
hit3b <= temp_hit3b;
|
|
|
|
v2b <= temp_v2b;
|
|
|
|
hit2b <= temp_hit2b;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(state or resultready)
|
|
|
|
begin
|
|
|
|
case (state)
|
|
|
|
0 :
|
|
|
|
begin
|
|
|
|
|
|
|
|
if (resultready == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
if (resultready == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_t1b = resultdata ;
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
1 :
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_u1b = resultdata[31:16] ;
|
|
|
|
temp_v1b = resultdata[15:0] ;
|
|
|
|
end
|
|
|
|
2 :
|
|
|
|
begin
|
|
|
|
next_state = 3 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_id1b = resultdata[15:0] ;
|
|
|
|
temp_hit1b = resultdata[16] ;
|
|
|
|
temp_resultID = resultdata[18:17] ;
|
|
|
|
end
|
|
|
|
3 :
|
|
|
|
begin
|
|
|
|
|
|
|
|
next_state = 4 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_t2b = resultdata ;
|
|
|
|
end
|
|
|
|
4 :
|
|
|
|
begin
|
|
|
|
next_state = 5 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_u2b = resultdata[31:16] ;
|
|
|
|
temp_v2b = resultdata[15:0] ;
|
|
|
|
end
|
|
|
|
5 :
|
|
|
|
begin
|
|
|
|
next_state = 6 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_id2b = resultdata[15:0] ;
|
|
|
|
temp_hit2b = resultdata[16] ;
|
|
|
|
end
|
|
|
|
6 :
|
|
|
|
begin
|
|
|
|
|
|
|
|
next_state = 7 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_t3b = resultdata ;
|
|
|
|
end
|
|
|
|
7 :
|
|
|
|
begin
|
|
|
|
next_state = 8 ;
|
|
|
|
temp_newdata = 1'b0 ;
|
|
|
|
temp_u3b = resultdata[31:16] ;
|
|
|
|
temp_v3b = resultdata[15:0] ;
|
|
|
|
end
|
|
|
|
8 :
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
temp_id3b = resultdata[15:0] ;
|
|
|
|
temp_hit3b = resultdata[16] ;
|
|
|
|
temp_newdata = 1'b1 ;
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
|
|
|
|
endmodule
|
|
|
|
module rayinterface (raygroup, raygroupwe, raygroupid, enablenear, rgData, rgAddr, rgWE, rgAddrValid, rgDone, raydata, rayaddr, raywe, globalreset, clk);
|
|
|
|
|
|
|
|
input[1:0] raygroup;
|
|
|
|
input raygroupwe;
|
|
|
|
input[1:0] raygroupid;
|
|
|
|
input enablenear;
|
|
|
|
input[31:0] rgData;
|
|
|
|
input[3:0] rgAddr;
|
|
|
|
input[2:0] rgWE;
|
|
|
|
|
|
|
|
input rgAddrValid;
|
|
|
|
output rgDone;
|
|
|
|
reg rgDone;
|
|
|
|
output[31:0] raydata;
|
|
|
|
reg[31:0] raydata;
|
|
|
|
output[3:0] rayaddr;
|
|
|
|
reg[3:0] rayaddr;
|
|
|
|
output[2:0] raywe;
|
|
|
|
reg[2:0] raywe;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
|
|
|
|
reg[31:0] rgDatal;
|
|
|
|
reg[3:0] rgAddrl;
|
|
|
|
reg[2:0] rgWEl;
|
|
|
|
reg rgAddrValidl;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
raydata <= 0;
|
|
|
|
rayaddr <= 0;
|
|
|
|
raywe <= 0;
|
|
|
|
|
|
|
|
rgDone <= 1'b0 ;
|
|
|
|
rgDatal <= 0;
|
|
|
|
rgAddrl <= 0;
|
|
|
|
rgWEl <= 0;
|
|
|
|
rgAddrValidl <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
rgDatal <= rgData ; // Latch interchip signals
|
|
|
|
rgAddrl <= rgAddr ; // To Meet Timing
|
|
|
|
rgWEl <= rgWE ;
|
|
|
|
|
|
|
|
rgAddrValidl <= rgAddrValid ;
|
|
|
|
|
|
|
|
if (raygroupwe == 1'b1)
|
|
|
|
begin
|
|
|
|
raydata[0] <= enablenear ;
|
|
|
|
raydata[31:1] <= 0;
|
|
|
|
raywe <= 3'b111 ;
|
|
|
|
rayaddr <= {raygroupid, raygroup} ;
|
|
|
|
if (rgAddrValidl == 1'b0)
|
|
|
|
rgDone <= 1'b0 ;
|
|
|
|
end
|
|
|
|
else if (rgAddrValidl == 1'b1 & rgDone == 1'b0)
|
|
|
|
begin
|
|
|
|
raydata <= rgDatal ;
|
|
|
|
raywe <= rgWEl ;
|
|
|
|
rayaddr <= rgAddrl ;
|
|
|
|
rgDone <= 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
raywe <= 0;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module sortedstack (keyin, datain, write, reset, peekdata, globalreset, clk);
|
|
|
|
|
|
|
|
input[32 - 1:0] keyin;
|
|
|
|
input[13 - 1:0] datain;
|
|
|
|
input write;
|
|
|
|
input reset;
|
|
|
|
output[13 * 8 - 1:0] peekdata;
|
|
|
|
|
|
|
|
wire[13 * 8 - 1:0] peekdata;
|
|
|
|
wire big_reset;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
reg[32 - 1:0] key0;
|
|
|
|
reg[32 - 1:0] key1;
|
|
|
|
reg[32 - 1:0] key2;
|
|
|
|
reg[32 - 1:0] key3;
|
|
|
|
reg[32 - 1:0] key4;
|
|
|
|
reg[32 - 1:0] key5;
|
|
|
|
reg[32 - 1:0] key6;
|
|
|
|
reg[32 - 1:0] key7;
|
|
|
|
reg[13 - 1:0] data0;
|
|
|
|
reg[13 - 1:0] data1;
|
|
|
|
reg[13 - 1:0] data2;
|
|
|
|
reg[13 - 1:0] data3;
|
|
|
|
reg[13 - 1:0] data4;
|
|
|
|
reg[13 - 1:0] data5;
|
|
|
|
reg[13 - 1:0] data6;
|
|
|
|
reg[13 - 1:0] data7;
|
|
|
|
reg full0;
|
|
|
|
reg full1;
|
|
|
|
reg full2;
|
|
|
|
reg full3;
|
|
|
|
reg full4;
|
|
|
|
reg full5;
|
|
|
|
reg full6;
|
|
|
|
reg full7;
|
|
|
|
reg[2:0] location;
|
|
|
|
|
|
|
|
assign peekdata[(0 + 1) * (13) - 1:0 * (13)] = ((full0) == 1'b1) ? data0 : 0;
|
|
|
|
assign peekdata[(1 + 1) * (13) - 1:1 * (13)] = ((full1) == 1'b1) ? data1 : 0;
|
|
|
|
assign peekdata[(2 + 1) * (13) - 1:2 * (13)] = ((full2) == 1'b1) ? data2 : 0;
|
|
|
|
assign peekdata[(3 + 1) * (13) - 1:3 * (13)] = ((full3) == 1'b1) ? data3 : 0;
|
|
|
|
assign peekdata[(4 + 1) * (13) - 1:4 * (13)] = ((full4) == 1'b1) ? data4 : 0;
|
|
|
|
assign peekdata[(5 + 1) * (13) - 1:5 * (13)] = ((full5) == 1'b1) ? data5 : 0;
|
|
|
|
assign peekdata[(6 + 1) * (13) - 1:6 * (13)] = ((full6) == 1'b1) ? data6 : 0;
|
|
|
|
assign peekdata[(7 + 1) * (13) - 1:7 * (13)] = ((full7) == 1'b1) ? data7 : 0;
|
|
|
|
|
|
|
|
// Select the proper insertion point
|
|
|
|
always @(keyin or key0 or key1 or key2 or key3 or key4 or key5 or key6 or key7 or full0 or full1 or full2 or full3 or full4 or full5 or full6 or full7)
|
|
|
|
begin
|
|
|
|
|
|
|
|
/* PAJ -- changed for loops */
|
|
|
|
if ((keyin < key0) | ((full0) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 0 ;
|
|
|
|
end
|
|
|
|
else if ((keyin < key1) | ((full1) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 1 ;
|
|
|
|
end
|
|
|
|
else if ((keyin < key2) | ((full2) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 2 ;
|
|
|
|
end
|
|
|
|
else if ((keyin < key3) | ((full3) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 3 ;
|
|
|
|
end
|
|
|
|
else if ((keyin < key4) | ((full4) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 4 ;
|
|
|
|
end
|
|
|
|
else if ((keyin < key5) | ((full5) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 5 ;
|
|
|
|
end
|
|
|
|
else if ((keyin < key6) | ((full6) == 1'b0))
|
|
|
|
begin
|
|
|
|
location = 6 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
location = 7;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
assign big_reset = globalreset | reset;
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (big_reset == 1'b1)
|
|
|
|
begin
|
|
|
|
full0 <= 1'b0 ;
|
|
|
|
key0 <= 0;
|
|
|
|
data0 <= 0;
|
|
|
|
full1 <= 1'b0 ;
|
|
|
|
key1 <= 0;
|
|
|
|
data1 <= 0;
|
|
|
|
full2 <= 1'b0 ;
|
|
|
|
key2 <= 0;
|
|
|
|
data2 <= 0;
|
|
|
|
full3 <= 1'b0 ;
|
|
|
|
key3 <= 0;
|
|
|
|
data3 <= 0;
|
|
|
|
full4 <= 1'b0 ;
|
|
|
|
key4 <= 0;
|
|
|
|
data4 <= 0;
|
|
|
|
full5 <= 1'b0 ;
|
|
|
|
key5 <= 0;
|
|
|
|
data5 <= 0;
|
|
|
|
full6 <= 1'b0 ;
|
|
|
|
key6 <= 0;
|
|
|
|
data6 <= 0;
|
|
|
|
full7 <= 1'b0 ;
|
|
|
|
key7 <= 0;
|
|
|
|
data7 <= 0;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
if (write == 1'b1)
|
|
|
|
begin
|
|
|
|
if (location == 0)
|
|
|
|
begin
|
|
|
|
key0 <= keyin;
|
|
|
|
data0 <= datain;
|
|
|
|
full0 <= 1'b1;
|
|
|
|
key1 <= key0;
|
|
|
|
data1 <= data0;
|
|
|
|
full1 <= full0;
|
|
|
|
key2 <= key1;
|
|
|
|
data2 <= data1;
|
|
|
|
full2 <= full1;
|
|
|
|
key3 <= key2;
|
|
|
|
data3 <= data2;
|
|
|
|
full3 <= full2;
|
|
|
|
key4 <= key3;
|
|
|
|
data4 <= data3;
|
|
|
|
full4 <= full3;
|
|
|
|
key5 <= key4;
|
|
|
|
data5 <= data4;
|
|
|
|
full5 <= full4;
|
|
|
|
key6 <= key5;
|
|
|
|
data6 <= data5;
|
|
|
|
full6 <= full5;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 1)
|
|
|
|
begin
|
|
|
|
key1 <= keyin;
|
|
|
|
data1 <= datain;
|
|
|
|
full1 <= 1'b1;
|
|
|
|
key2 <= key1;
|
|
|
|
data2 <= data1;
|
|
|
|
full2 <= full1;
|
|
|
|
key3 <= key2;
|
|
|
|
data3 <= data2;
|
|
|
|
full3 <= full2;
|
|
|
|
key4 <= key3;
|
|
|
|
data4 <= data3;
|
|
|
|
full4 <= full3;
|
|
|
|
key5 <= key4;
|
|
|
|
data5 <= data4;
|
|
|
|
full5 <= full4;
|
|
|
|
key6 <= key5;
|
|
|
|
data6 <= data5;
|
|
|
|
full6 <= full5;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 2)
|
|
|
|
begin
|
|
|
|
key2 <= keyin;
|
|
|
|
data2 <= datain;
|
|
|
|
full2 <= 1'b1;
|
|
|
|
key3 <= key2;
|
|
|
|
data3 <= data2;
|
|
|
|
full3 <= full2;
|
|
|
|
key4 <= key3;
|
|
|
|
data4 <= data3;
|
|
|
|
full4 <= full3;
|
|
|
|
key5 <= key4;
|
|
|
|
data5 <= data4;
|
|
|
|
full5 <= full4;
|
|
|
|
key6 <= key5;
|
|
|
|
data6 <= data5;
|
|
|
|
full6 <= full5;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 2)
|
|
|
|
begin
|
|
|
|
key3 <= keyin;
|
|
|
|
data3 <= datain;
|
|
|
|
full3 <= 1'b1;
|
|
|
|
data4 <= data3;
|
|
|
|
full4 <= full3;
|
|
|
|
key5 <= key4;
|
|
|
|
data5 <= data4;
|
|
|
|
full5 <= full4;
|
|
|
|
key6 <= key5;
|
|
|
|
data6 <= data5;
|
|
|
|
full6 <= full5;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 4)
|
|
|
|
begin
|
|
|
|
key4 <= keyin;
|
|
|
|
data4 <= datain;
|
|
|
|
full4 <= 1'b1;
|
|
|
|
key5 <= key4;
|
|
|
|
data5 <= data4;
|
|
|
|
full5 <= full4;
|
|
|
|
key6 <= key5;
|
|
|
|
data6 <= data5;
|
|
|
|
full6 <= full5;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 5)
|
|
|
|
begin
|
|
|
|
key5 <= keyin;
|
|
|
|
data5 <= datain;
|
|
|
|
full5 <= 1'b1;
|
|
|
|
key6 <= key5;
|
|
|
|
data6 <= data5;
|
|
|
|
full6 <= full5;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 6)
|
|
|
|
begin
|
|
|
|
key6 <= keyin;
|
|
|
|
data6 <= datain;
|
|
|
|
full6 <= 1'b1;
|
|
|
|
key7 <= key6;
|
|
|
|
data7 <= data6;
|
|
|
|
full7 <= full6;
|
|
|
|
end
|
|
|
|
else if (location == 7)
|
|
|
|
begin
|
|
|
|
key7 <= keyin;
|
|
|
|
data7 <= datain;
|
|
|
|
full7 <= 1'b1;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module listhandler (dataarrayin, commit, hitmask, ack, boundnodeID, level, empty, dataready, reset, globalreset, clk, peekoffset0, peekoffset1, peekoffset2, peekhit, peekstate);
|
|
|
|
|
|
|
|
input[8 * 13 - 1:0] dataarrayin;
|
|
|
|
input commit;
|
|
|
|
input[2:0] hitmask;
|
|
|
|
input ack;
|
|
|
|
output[9:0] boundnodeID;
|
|
|
|
wire[9:0] boundnodeID;
|
|
|
|
output[1:0] level;
|
|
|
|
wire[1:0] level;
|
|
|
|
|
|
|
|
output empty;
|
|
|
|
wire empty;
|
|
|
|
output dataready;
|
|
|
|
wire dataready;
|
|
|
|
input reset;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
output[2:0] peekoffset0;
|
|
|
|
wire[2:0] peekoffset0;
|
|
|
|
output[2:0] peekoffset1;
|
|
|
|
wire[2:0] peekoffset1;
|
|
|
|
output[2:0] peekoffset2;
|
|
|
|
|
|
|
|
wire[2:0] peekoffset2;
|
|
|
|
output peekhit;
|
|
|
|
wire peekhit;
|
|
|
|
output[1:0] peekstate;
|
|
|
|
reg[1:0] peekstate;
|
|
|
|
reg[1:0] temp_peekstate;
|
|
|
|
|
|
|
|
reg[1:0] next_state;
|
|
|
|
reg[1:0] state;
|
|
|
|
reg[1:0] readlevel;
|
|
|
|
|
|
|
|
reg[1:0] writelevel;
|
|
|
|
reg[2:0] offset0;
|
|
|
|
reg[2:0] offset1;
|
|
|
|
reg[2:0] offset2;
|
|
|
|
reg[4:0] address;
|
|
|
|
reg we;
|
|
|
|
reg[12:0] datain;
|
|
|
|
wire[12:0] dataout;
|
|
|
|
reg[2:0] lvempty;
|
|
|
|
reg busy;
|
|
|
|
reg temp_busy;
|
|
|
|
reg[2:0] temp_lvempty;
|
|
|
|
reg[1:0] temp_readlevel;
|
|
|
|
reg[1:0] temp_writelevel;
|
|
|
|
reg[2:0] temp_offset0;
|
|
|
|
reg[2:0] temp_offset1;
|
|
|
|
reg[2:0] temp_offset2;
|
|
|
|
|
|
|
|
// Debug Stuff
|
|
|
|
|
|
|
|
assign peekoffset0 = offset0 ;
|
|
|
|
assign peekoffset1 = offset1 ;
|
|
|
|
assign peekoffset2 = offset2 ;
|
|
|
|
assign peekhit = ((datain[10]) == 1'b1 | (datain[11]) == 1'b1 | (datain[12]) == 1'b1) ? 1'b1 : 1'b0 ;
|
|
|
|
|
|
|
|
// Real Code
|
|
|
|
|
|
|
|
spram ram(we, dataout, datain, clk);
|
|
|
|
|
|
|
|
assign level = readlevel ;
|
|
|
|
assign boundnodeID = dataout[9:0] ;
|
|
|
|
|
|
|
|
assign empty = (lvempty == 3'b111 & busy == 1'b0) ? 1'b1 : 1'b0 ;
|
|
|
|
assign dataready = ((((dataout[10]) == 1'b1 & (hitmask[0]) == 1'b1) | ((dataout[11]) == 1'b1 & (hitmask[1]) == 1'b1) | ((dataout[12]) == 1'b1 & (hitmask[2]) == 1'b1)) & (empty == 1'b0) & (busy == 1'b0)) ? 1'b1 : 1'b0 ;
|
|
|
|
|
|
|
|
always @(offset0 or offset1 or offset2 or address)
|
|
|
|
begin
|
|
|
|
address[4:3] = readlevel ;
|
|
|
|
|
|
|
|
if (address[4:3] == 2'b00)
|
|
|
|
begin
|
|
|
|
address[2:0] = offset0 ;
|
|
|
|
end
|
|
|
|
else if (address[4:3] == 2'b01)
|
|
|
|
begin
|
|
|
|
|
|
|
|
address[2:0] = offset1 ;
|
|
|
|
end
|
|
|
|
else if (address[4:3] == 2'b10)
|
|
|
|
begin
|
|
|
|
address[2:0] = offset2 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
address[2:0] = 0;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (globalreset == 1'b1)
|
|
|
|
begin
|
|
|
|
state <= 0 ;
|
|
|
|
lvempty <= 1;
|
|
|
|
busy <= 1'b0 ;
|
|
|
|
readlevel <= 2'b00 ;
|
|
|
|
writelevel <= 2'b00 ;
|
|
|
|
offset0 <= 3'b000 ;
|
|
|
|
offset1 <= 3'b000 ;
|
|
|
|
offset2 <= 3'b000 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
state <= next_state ;
|
|
|
|
peekstate <= temp_peekstate ;
|
|
|
|
busy <= temp_busy;
|
|
|
|
lvempty <= temp_lvempty;
|
|
|
|
readlevel <= temp_readlevel;
|
|
|
|
writelevel <= temp_writelevel;
|
|
|
|
offset0 <= temp_offset0;
|
|
|
|
offset1 <= temp_offset1;
|
|
|
|
offset2 <= temp_offset2;
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(state or commit or ack or address or dataarrayin or reset or dataready or
|
|
|
|
empty)
|
|
|
|
begin
|
|
|
|
|
|
|
|
case (state)
|
|
|
|
2'b00 :
|
|
|
|
begin
|
|
|
|
we = 1'b0 ;
|
|
|
|
datain = 0;
|
|
|
|
if (reset == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
else if (commit == 1'b1)
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
else if ((ack == 1'b1) | (dataready == 1'b0 & empty == 1'b0))
|
|
|
|
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 0 ;
|
|
|
|
end
|
|
|
|
temp_peekstate = 2'b01 ;
|
|
|
|
|
|
|
|
if (reset == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
temp_lvempty = 1;
|
|
|
|
temp_readlevel = 2'b00 ;
|
|
|
|
|
|
|
|
temp_writelevel = 2'b00 ;
|
|
|
|
temp_offset0 = 3'b000 ;
|
|
|
|
temp_offset1 = 3'b000 ;
|
|
|
|
temp_offset2 = 3'b000 ;
|
|
|
|
end
|
|
|
|
else if (commit == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_busy = 1'b1 ;
|
|
|
|
if (writelevel == 2'b00)
|
|
|
|
begin
|
|
|
|
temp_offset0 = 3'b000 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
else if (writelevel == 2'b01)
|
|
|
|
begin
|
|
|
|
temp_offset1 = 3'b000 ;
|
|
|
|
end
|
|
|
|
else if (writelevel == 2'b10)
|
|
|
|
begin
|
|
|
|
temp_offset2 = 3'b000 ;
|
|
|
|
end
|
|
|
|
temp_readlevel = writelevel ;
|
|
|
|
end
|
|
|
|
|
|
|
|
else if (ack == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_writelevel = readlevel + 1 ;
|
|
|
|
temp_busy = 1'b1 ; // This will ensure that align skips one
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
2'b01 :
|
|
|
|
begin
|
|
|
|
/* PAJ -- Unrolled loop */
|
|
|
|
if (address[2:0] == 0)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(1) * 13 - 1:0 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] == 1)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(2) * 13 - 1:1 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] ==2)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(3) * 13 - 1:2 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] ==3)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(4) * 13 - 1:3 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] ==4)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(5) * 13 - 1:4 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] ==5)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(6) * 13 - 1:5 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] ==6)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(7) * 13 - 1:6 * 13] ;
|
|
|
|
end
|
|
|
|
else if ( address[2:0] ==7)
|
|
|
|
begin
|
|
|
|
datain = dataarrayin[(8) * 13 - 1:7 * 13] ;
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
we = 1'b1 ;
|
|
|
|
if (address[2:0] == 3'b111)
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
next_state = 1 ;
|
|
|
|
end
|
|
|
|
temp_peekstate = 2'b10 ;
|
|
|
|
|
|
|
|
if (readlevel == 2'b00)
|
|
|
|
begin
|
|
|
|
temp_offset0 = offset0 + 1 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
else if (readlevel == 2'b01)
|
|
|
|
begin
|
|
|
|
temp_offset1 = offset1 + 1 ;
|
|
|
|
end
|
|
|
|
else if (readlevel == 2'b10)
|
|
|
|
begin
|
|
|
|
temp_offset2 = offset2 + 1 ;
|
|
|
|
end
|
|
|
|
if (address[2:0] == 3'b111)
|
|
|
|
begin
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
end
|
|
|
|
|
|
|
|
if ((datain[10]) == 1'b1 | (datain[11]) == 1'b1 | (datain[12]) == 1'b1)
|
|
|
|
begin
|
|
|
|
if (readlevel == 2'b00)
|
|
|
|
begin
|
|
|
|
temp_lvempty[0] = 1'b0 ;
|
|
|
|
end
|
|
|
|
else if (readlevel == 2'b01)
|
|
|
|
begin
|
|
|
|
temp_lvempty[1] = 1'b0 ;
|
|
|
|
end
|
|
|
|
else if (readlevel == 2'b10)
|
|
|
|
begin
|
|
|
|
|
|
|
|
temp_lvempty[2] = 1'b0 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
2'b10 :
|
|
|
|
begin
|
|
|
|
if (empty == 1'b0 & dataready == 1'b0)
|
|
|
|
begin
|
|
|
|
next_state = 2 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
next_state = 0 ;
|
|
|
|
|
|
|
|
temp_peekstate = 2'b11 ;
|
|
|
|
temp_busy = 1'b0 ;
|
|
|
|
if (empty == 1'b0 & dataready == 1'b0)
|
|
|
|
begin
|
|
|
|
if (readlevel == 2'b00)
|
|
|
|
begin
|
|
|
|
if (offset0 == 3'b111)
|
|
|
|
begin
|
|
|
|
temp_lvempty[0] = 1'b1 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
temp_offset0 = offset0 + 1 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else if (readlevel == 2'b01)
|
|
|
|
begin
|
|
|
|
if (offset1 == 3'b111)
|
|
|
|
begin
|
|
|
|
temp_lvempty[1] = 1'b1 ;
|
|
|
|
temp_readlevel = 2'b00 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
temp_offset1 = offset1 + 1 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else if (readlevel == 2'b10)
|
|
|
|
begin
|
|
|
|
if (offset2 == 3'b111)
|
|
|
|
begin
|
|
|
|
temp_lvempty[2] = 1'b1 ;
|
|
|
|
if ((lvempty[1]) == 1'b1)
|
|
|
|
begin
|
|
|
|
temp_readlevel = 2'b00 ;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
temp_readlevel = 2'b01 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
temp_offset2 = offset2 + 1 ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endcase
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module spram (we, dataout, datain, clk);
|
|
|
|
|
|
|
|
input we;
|
|
|
|
output[13 - 1:0] dataout;
|
|
|
|
wire[13 - 1:0] dataout;
|
|
|
|
input[13 - 1:0] datain;
|
|
|
|
input clk;
|
|
|
|
reg[13 - 1:0] temp_reg;
|
|
|
|
|
|
|
|
reg[13 - 1:0] mem1;
|
|
|
|
reg[13 - 1:0] mem2;
|
|
|
|
|
|
|
|
assign dataout = mem2 ;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
temp_reg <= 0;
|
|
|
|
if (we == 1'b1)
|
|
|
|
begin
|
|
|
|
mem1 <= datain + temp_reg;
|
|
|
|
mem2 <= mem1;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
module resultcounter (resultID, newresult, done, reset, globalreset, clk);
|
|
|
|
|
|
|
|
input[1:0] resultID;
|
|
|
|
input newresult;
|
|
|
|
output[1:0] done;
|
|
|
|
wire[1:0] done;
|
|
|
|
input reset;
|
|
|
|
input globalreset;
|
|
|
|
input clk;
|
|
|
|
|
|
|
|
wire big_reset;
|
|
|
|
|
|
|
|
reg[3:0] count;
|
|
|
|
reg[1:0] curr;
|
|
|
|
|
|
|
|
assign done = (count == 0) ? curr : 2'b00 ;
|
|
|
|
assign big_reset = globalreset | reset;
|
|
|
|
|
|
|
|
always @(posedge clk)
|
|
|
|
begin
|
|
|
|
if (big_reset == 1'b1)
|
|
|
|
begin
|
|
|
|
count <= 4'b1000 ;
|
|
|
|
curr <= 0;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
if ((resultID != 0) & (newresult == 1'b1) & (count != 0))
|
|
|
|
begin
|
|
|
|
count <= count - 1 ;
|
|
|
|
curr <= resultID ;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
endmodule
|
|
|
|
|