From 32590d484cff29ab48f5df70c7cf977219eb13ce Mon Sep 17 00:00:00 2001 From: David Harris Date: Wed, 5 Jan 2022 16:25:08 +0000 Subject: [PATCH] Removed more generate statements --- pipelined/fpu-testfloat/FMA/tbgen/tb.sv | 2 +- pipelined/ppa/ppa.sv | 14 +- pipelined/src/cache/cachereplacementpolicy.sv | 161 +++++---- pipelined/src/cache/cacheway.sv | 51 ++- pipelined/src/cache/dcache.sv | 33 +- pipelined/src/cache/icache.sv | 29 +- pipelined/src/ebu/amoalu.sv | 37 +-- pipelined/src/fpu/cvtfp.sv | 4 +- pipelined/src/fpu/divconv_pipe.sv | 4 +- pipelined/src/fpu/fcvt.sv | 6 +- pipelined/src/fpu/fma.sv | 9 +- pipelined/src/ieu/shifter.sv | 46 ++- pipelined/src/ifu/bpred.sv | 124 ++++--- pipelined/src/ifu/ifu.sv | 62 ++-- pipelined/src/ifu/localHistoryPredictor.sv | 14 +- pipelined/src/lsu/lsu.sv | 314 +++++++++--------- pipelined/src/uncore/ram.sv | 124 ++++--- pipelined/src/uncore/subwordwrite.sv | 127 ++++--- pipelined/src/uncore/uart.sv | 50 ++- pipelined/testbench/testbench-linux.sv | 2 +- 20 files changed, 562 insertions(+), 651 deletions(-) diff --git a/pipelined/fpu-testfloat/FMA/tbgen/tb.sv b/pipelined/fpu-testfloat/FMA/tbgen/tb.sv index 9091af1ad..621429aa4 100644 --- a/pipelined/fpu-testfloat/FMA/tbgen/tb.sv +++ b/pipelined/fpu-testfloat/FMA/tbgen/tb.sv @@ -153,7 +153,7 @@ fma2 UUT2(.XSgnM(XSgnE), .YSgnM(YSgnE), .XExpM(XExpE), .YExpM(YExpE), .ZExpM(ZEx .FmtM(FmtE), .FrmM(FrmE), .FMAFlgM, .FMAResM); - // generate clock + // produce clock always begin clk = 1; #5; clk = 0; #5; diff --git a/pipelined/ppa/ppa.sv b/pipelined/ppa/ppa.sv index 84ae7d971..8ff8bdcc0 100644 --- a/pipelined/ppa/ppa.sv +++ b/pipelined/ppa/ppa.sv @@ -45,14 +45,12 @@ endmodule module INVX2(input logic a, output logic y); - generate - if (LIB == SKY130) - sky130_osu_sc_12T_ms__inv_2 inv(a, y); - else if (LIB == SKL90) - scc9gena_inv_2 inv(a, y) - else if (LIB == GF14) - INV_X2N_A10P5PP84TSL_C14(a, y) - endgenerate + if (LIB == SKY130) + sky130_osu_sc_12T_ms__inv_2 inv(a, y); + else if (LIB == SKL90) + scc9gena_inv_2 inv(a, y) + else if (LIB == GF14) + INV_X2N_A10P5PP84TSL_C14(a, y) endmodule module driver #(parameter WDITH=1) ( diff --git a/pipelined/src/cache/cachereplacementpolicy.sv b/pipelined/src/cache/cachereplacementpolicy.sv index 1ce84a320..71206eb3d 100644 --- a/pipelined/src/cache/cachereplacementpolicy.sv +++ b/pipelined/src/cache/cachereplacementpolicy.sv @@ -72,109 +72,106 @@ module cachereplacementpolicy assign LineReplacementBits = ReplacementBits[RAdrD]; genvar index; - generate - if(NUMWAYS == 2) begin : TwoWay - - assign LRUEn[0] = 1'b0; + if(NUMWAYS == 2) begin : TwoWay + + assign LRUEn[0] = 1'b0; - assign NewReplacement[0] = WayHit[1]; + assign NewReplacement[0] = WayHit[1]; - assign VictimWay[1] = ~LineReplacementBits[0]; - assign VictimWay[0] = LineReplacementBits[0]; - - end else if (NUMWAYS == 4) begin : FourWay + assign VictimWay[1] = ~LineReplacementBits[0]; + assign VictimWay[0] = LineReplacementBits[0]; + + end else if (NUMWAYS == 4) begin : FourWay - // VictimWay is a function only of the current value of the LRU. - // binary encoding - //assign VictimWay[0] = LineReplacementBits[2] ? LineReplacementBits[1] : LineReplacementBits[0]; - //assign VictimWay[1] = LineReplacementBits[2]; + // VictimWay is a function only of the current value of the LRU. + // binary encoding + //assign VictimWay[0] = LineReplacementBits[2] ? LineReplacementBits[1] : LineReplacementBits[0]; + //assign VictimWay[1] = LineReplacementBits[2]; - // 1 hot encoding - //| WayHit | LRU 2 | LRU 1 | LRU 0 | - //|--------+-------+-------+-------| - //| 0000 | - | - | - | - //| 0001 | 1 | - | 1 | - //| 0010 | 1 | - | 0 | - //| 0100 | 0 | 1 | - | - //| 1000 | 0 | 0 | - | + // 1 hot encoding + //| WayHit | LRU 2 | LRU 1 | LRU 0 | + //|--------+-------+-------+-------| + //| 0000 | - | - | - | + //| 0001 | 1 | - | 1 | + //| 0010 | 1 | - | 0 | + //| 0100 | 0 | 1 | - | + //| 1000 | 0 | 0 | - | - assign VictimWay[0] = ~LineReplacementBits[2] & ~LineReplacementBits[0]; - assign VictimWay[1] = ~LineReplacementBits[2] & LineReplacementBits[0]; - assign VictimWay[2] = LineReplacementBits[2] & ~LineReplacementBits[1]; - assign VictimWay[3] = LineReplacementBits[2] & LineReplacementBits[1]; + assign VictimWay[0] = ~LineReplacementBits[2] & ~LineReplacementBits[0]; + assign VictimWay[1] = ~LineReplacementBits[2] & LineReplacementBits[0]; + assign VictimWay[2] = LineReplacementBits[2] & ~LineReplacementBits[1]; + assign VictimWay[3] = LineReplacementBits[2] & LineReplacementBits[1]; - // New LRU bits which are updated is function only of the WayHit. - // However the not updated bits come from the old LRU. - assign LRUEn[2] = |WayHit; - assign LRUEn[1] = WayHit[3] | WayHit[2]; - assign LRUEn[0] = WayHit[1] | WayHit[0]; + // New LRU bits which are updated is function only of the WayHit. + // However the not updated bits come from the old LRU. + assign LRUEn[2] = |WayHit; + assign LRUEn[1] = WayHit[3] | WayHit[2]; + assign LRUEn[0] = WayHit[1] | WayHit[0]; - assign LRUMask[2] = WayHit[1] | WayHit[0]; - assign LRUMask[1] = WayHit[2]; - assign LRUMask[0] = WayHit[0]; - + assign LRUMask[2] = WayHit[1] | WayHit[0]; + assign LRUMask[1] = WayHit[2]; + assign LRUMask[0] = WayHit[0]; + /* -----\/----- EXCLUDED -----\/----- - // selects - assign LRUEn[2] = 1'b1; - assign LRUEn[1] = WayHit[3]; - assign LRUEn[0] = WayHit[3] | WayHit[2]; + // selects + assign LRUEn[2] = 1'b1; + assign LRUEn[1] = WayHit[3]; + assign LRUEn[0] = WayHit[3] | WayHit[2]; - // mask - assign LRUMask[0] = WayHit[1]; - assign LRUMask[1] = WayHit[3]; - assign LRUMask[2] = WayHit[3] | WayHit[2]; - -----/\----- EXCLUDED -----/\----- */ + // mask + assign LRUMask[0] = WayHit[1]; + assign LRUMask[1] = WayHit[3]; + assign LRUMask[2] = WayHit[3] | WayHit[2]; +-----/\----- EXCLUDED -----/\----- */ - for(index = 0; index < NUMWAYS-1; index++) - assign NewReplacement[index] = LRUEn[index] ? LRUMask[index] : LineReplacementBits[index]; + for(index = 0; index < NUMWAYS-1; index++) +assign NewReplacement[index] = LRUEn[index] ? LRUMask[index] : LineReplacementBits[index]; /* -----\/----- EXCLUDED -----\/----- - assign EncVicWay[1] = LineReplacementBits[2]; - assign EncVicWay[0] = LineReplacementBits[2] ? LineReplacementBits[0] : LineReplacementBits[1]; + assign EncVicWay[1] = LineReplacementBits[2]; + assign EncVicWay[0] = LineReplacementBits[2] ? LineReplacementBits[0] : LineReplacementBits[1]; - onehotdecoder #(2) - waydec(.bin(EncVicWay), - .decoded({VictimWay[0], VictimWay[1], VictimWay[2], VictimWay[3]})); - -----/\----- EXCLUDED -----/\----- */ + onehotdecoder #(2) + waydec(.bin(EncVicWay), + .decoded({VictimWay[0], VictimWay[1], VictimWay[2], VictimWay[3]})); +-----/\----- EXCLUDED -----/\----- */ - end else if (NUMWAYS == 8) begin : EightWay + end else if (NUMWAYS == 8) begin : EightWay - // selects - assign LRUEn[6] = 1'b1; - assign LRUEn[5] = WayHit[7] | WayHit[6] | WayHit[5] | WayHit[4]; - assign LRUEn[4] = WayHit[7] | WayHit[6]; - assign LRUEn[3] = WayHit[5] | WayHit[4]; - assign LRUEn[2] = WayHit[3] | WayHit[2] | WayHit[1] | WayHit[0]; - assign LRUEn[1] = WayHit[3] | WayHit[2]; - assign LRUEn[0] = WayHit[1] | WayHit[0]; + // selects + assign LRUEn[6] = 1'b1; + assign LRUEn[5] = WayHit[7] | WayHit[6] | WayHit[5] | WayHit[4]; + assign LRUEn[4] = WayHit[7] | WayHit[6]; + assign LRUEn[3] = WayHit[5] | WayHit[4]; + assign LRUEn[2] = WayHit[3] | WayHit[2] | WayHit[1] | WayHit[0]; + assign LRUEn[1] = WayHit[3] | WayHit[2]; + assign LRUEn[0] = WayHit[1] | WayHit[0]; - // mask - assign LRUMask[6] = WayHit[7] | WayHit[6] | WayHit[5] | WayHit[4]; - assign LRUMask[5] = WayHit[7] | WayHit[6]; - assign LRUMask[4] = WayHit[7]; - assign LRUMask[3] = WayHit[5]; - assign LRUMask[2] = WayHit[3] | WayHit[2]; - assign LRUMask[1] = WayHit[2]; - assign LRUMask[0] = WayHit[0]; + // mask + assign LRUMask[6] = WayHit[7] | WayHit[6] | WayHit[5] | WayHit[4]; + assign LRUMask[5] = WayHit[7] | WayHit[6]; + assign LRUMask[4] = WayHit[7]; + assign LRUMask[3] = WayHit[5]; + assign LRUMask[2] = WayHit[3] | WayHit[2]; + assign LRUMask[1] = WayHit[2]; + assign LRUMask[0] = WayHit[0]; - for(index = 0; index < NUMWAYS-1; index++) - assign NewReplacement[index] = LRUEn[index] ? LRUMask[index] : LineReplacementBits[index]; + for(index = 0; index < NUMWAYS-1; index++) +assign NewReplacement[index] = LRUEn[index] ? LRUMask[index] : LineReplacementBits[index]; - assign EncVicWay[2] = LineReplacementBits[6]; - assign EncVicWay[1] = LineReplacementBits[6] ? LineReplacementBits[5] : LineReplacementBits[2]; - assign EncVicWay[0] = LineReplacementBits[6] ? LineReplacementBits[5] ? LineReplacementBits[4] : LineReplacementBits[3] : - LineReplacementBits[2] ? LineReplacementBits[1] : LineReplacementBits[0]; - + assign EncVicWay[2] = LineReplacementBits[6]; + assign EncVicWay[1] = LineReplacementBits[6] ? LineReplacementBits[5] : LineReplacementBits[2]; + assign EncVicWay[0] = LineReplacementBits[6] ? LineReplacementBits[5] ? LineReplacementBits[4] : LineReplacementBits[3] : + LineReplacementBits[2] ? LineReplacementBits[1] : LineReplacementBits[0]; + - onehotdecoder #(3) - waydec(.bin(EncVicWay), - .decoded({VictimWay[0], VictimWay[1], VictimWay[2], VictimWay[3], - VictimWay[4], VictimWay[5], VictimWay[6], VictimWay[7]})); - end - endgenerate - + onehotdecoder #(3) + waydec(.bin(EncVicWay), + .decoded({VictimWay[0], VictimWay[1], VictimWay[2], VictimWay[3], + VictimWay[4], VictimWay[5], VictimWay[6], VictimWay[7]})); + end endmodule diff --git a/pipelined/src/cache/cacheway.sv b/pipelined/src/cache/cacheway.sv index ce25ab862..f16d7194b 100644 --- a/pipelined/src/cache/cacheway.sv +++ b/pipelined/src/cache/cacheway.sv @@ -72,16 +72,13 @@ module cacheway #(parameter NUMLINES=512, parameter LINELEN = 256, TAGLEN = 26, genvar words; - - generate - for(words = 0; words < LINELEN/`XLEN; words++) begin : word - sram1rw #(.DEPTH(`XLEN), .WIDTH(NUMLINES)) - CacheDataMem(.clk(clk), .Addr(RAdr), - .ReadData(ReadDataLineWay[(words+1)*`XLEN-1:words*`XLEN] ), - .WriteData(WriteData[(words+1)*`XLEN-1:words*`XLEN]), - .WriteEnable(WriteEnable & WriteWordEnable[words])); - end - endgenerate + for(words = 0; words < LINELEN/`XLEN; words++) begin: word + sram1rw #(.DEPTH(`XLEN), .WIDTH(NUMLINES)) + CacheDataMem(.clk(clk), .Addr(RAdr), + .ReadData(ReadDataLineWay[(words+1)*`XLEN-1:words*`XLEN] ), + .WriteData(WriteData[(words+1)*`XLEN-1:words*`XLEN]), + .WriteEnable(WriteEnable & WriteWordEnable[words])); + end sram1rw #(.DEPTH(TAGLEN), .WIDTH(NUMLINES)) CacheTagMem(.clk(clk), @@ -123,27 +120,21 @@ module cacheway #(parameter NUMLINES=512, parameter LINELEN = 256, TAGLEN = 26, assign Valid = ValidBits[RAdrD]; - generate - if(DIRTY_BITS) begin:dirty - always_ff @(posedge clk) begin - if (reset) - DirtyBits <= {NUMLINES{1'b0}}; - else if (SetDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[RAdrD] <= 1'b1; - else if (ClearDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[RAdrD] <= 1'b0; - end - - always_ff @(posedge clk) begin - SetDirtyD <= SetDirty; - ClearDirtyD <= ClearDirty; - end - - assign Dirty = DirtyBits[RAdrD]; - - end else begin:dirty - assign Dirty = 1'b0; + // Dirty bits + if(DIRTY_BITS) begin:dirty + always_ff @(posedge clk) begin + if (reset) DirtyBits <= {NUMLINES{1'b0}}; + else if (SetDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[RAdrD] <= 1'b1; + else if (ClearDirtyD & (WriteEnableD | VDWriteEnableD)) DirtyBits[RAdrD] <= 1'b0; end - endgenerate - + always_ff @(posedge clk) begin + SetDirtyD <= SetDirty; + ClearDirtyD <= ClearDirty; + end + assign Dirty = DirtyBits[RAdrD]; + end else begin:dirty + assign Dirty = 1'b0; + end endmodule // DCacheMemWay diff --git a/pipelined/src/cache/dcache.sv b/pipelined/src/cache/dcache.sv index 361ba8fa5..dd0b7d7ed 100644 --- a/pipelined/src/cache/dcache.sv +++ b/pipelined/src/cache/dcache.sv @@ -143,19 +143,17 @@ module dcache #(parameter integer LINELEN, .WayHit, .VictimDirtyWay, .VictimTagWay, .InvalidateAll(1'b0)); - generate - if(NUMWAYS > 1) begin:vict - cachereplacementpolicy #(NUMWAYS, INDEXLEN, OFFSETLEN, NUMLINES) - cachereplacementpolicy(.clk, .reset, - .WayHit, - .VictimWay, - .LsuPAdrM(LsuPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]), - .RAdr, - .LRUWriteEn); - end else begin:vict - assign VictimWay = 1'b1; // one hot. - end - endgenerate + if(NUMWAYS > 1) begin:vict + cachereplacementpolicy #(NUMWAYS, INDEXLEN, OFFSETLEN, NUMLINES) + cachereplacementpolicy(.clk, .reset, + .WayHit, + .VictimWay, + .LsuPAdrM(LsuPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]), + .RAdr, + .LRUWriteEn); + end else begin:vict + assign VictimWay = 1'b1; // one hot. + end assign CacheHit = | WayHit; assign VictimDirty = | VictimDirtyWay; @@ -172,12 +170,9 @@ module dcache #(parameter integer LINELEN, // easily build a variable input mux. // *** consider using a limited range shift to do this final muxing. genvar index; - generate - for (index = 0; index < WORDSPERLINE; index++) begin:readdatalinesetsmux - assign ReadDataLineSetsM[index] = ReadDataLineM[((index+1)*`XLEN)-1: (index*`XLEN)]; - end - endgenerate - + for (index = 0; index < WORDSPERLINE; index++) + assign ReadDataLineSetsM[index] = ReadDataLineM[((index+1)*`XLEN)-1: (index*`XLEN)]; + // variable input mux assign ReadDataWordM = ReadDataLineSetsM[LsuPAdrM[LOGWPL + LOGXLENBYTES - 1 : LOGXLENBYTES]]; diff --git a/pipelined/src/cache/icache.sv b/pipelined/src/cache/icache.sv index 4af94fe14..9cee03c97 100644 --- a/pipelined/src/cache/icache.sv +++ b/pipelined/src/cache/icache.sv @@ -114,19 +114,17 @@ module icache #(parameter integer LINELEN, .VictimDirtyWay(), .VictimTagWay(), .InvalidateAll(InvalidateICacheM)); - generate - if(NUMWAYS > 1) begin:vict - cachereplacementpolicy #(NUMWAYS, INDEXLEN, OFFSETLEN, NUMLINES) - cachereplacementpolicy(.clk, .reset, - .WayHit, - .VictimWay, - .LsuPAdrM(PCPF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]), - .RAdr, - .LRUWriteEn); - end else begin:vict - assign VictimWay = 1'b1; // one hot. - end - endgenerate + if(NUMWAYS > 1) begin:vict + cachereplacementpolicy #(NUMWAYS, INDEXLEN, OFFSETLEN, NUMLINES) + cachereplacementpolicy(.clk, .reset, + .WayHit, + .VictimWay, + .LsuPAdrM(PCPF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]), + .RAdr, + .LRUWriteEn); + end else begin:vict + assign VictimWay = 1'b1; // one hot. + end assign hit = | WayHit; @@ -136,12 +134,9 @@ module icache #(parameter integer LINELEN, or_rows #(NUMWAYS, LINELEN) ReadDataAOMux(.a(ReadDataLineWayMasked), .y(ReadLineF)); genvar index; - generate - for(index = 0; index < LINELEN / 16 - 1; index++) begin:readlinesetsmux + for(index = 0; index < LINELEN / 16 - 1; index++) assign ReadLineSetsF[index] = ReadLineF[((index+1)*16)+16-1 : (index*16)]; - end assign ReadLineSetsF[LINELEN/16-1] = {16'b0, ReadLineF[LINELEN-1:LINELEN-16]}; - endgenerate assign FinalInstrRawF = ReadLineSetsF[PCPF[$clog2(LINELEN / 32) + 1 : 1]]; diff --git a/pipelined/src/ebu/amoalu.sv b/pipelined/src/ebu/amoalu.sv index e8a77d603..5d3a137ab 100644 --- a/pipelined/src/ebu/amoalu.sv +++ b/pipelined/src/ebu/amoalu.sv @@ -56,25 +56,22 @@ module amoalu ( endcase // sign extend if necessary - generate - if (`XLEN == 32) begin:sext - assign a = srca; - assign b = srcb; - assign result = y; - end else begin:sext // `XLEN = 64 - always_comb - if (width == 2'b10) begin // sign-extend word-length operations - // *** it would be more efficient to look at carry out of bit 31 to determine comparisons than do this big mux on and b - a = {{32{srca[31]}}, srca[31:0]}; - b = {{32{srcb[31]}}, srcb[31:0]}; - result = {{32{y[31]}}, y[31:0]}; - end else begin - a = srca; - b = srcb; - result = y; - end - end - endgenerate - + if (`XLEN == 32) begin:sext + assign a = srca; + assign b = srcb; + assign result = y; + end else begin:sext // `XLEN = 64 + always_comb + if (width == 2'b10) begin // sign-extend word-length operations + // *** it would be more efficient to look at carry out of bit 31 to determine comparisons than do this big mux on and b + a = {{32{srca[31]}}, srca[31:0]}; + b = {{32{srcb[31]}}, srcb[31:0]}; + result = {{32{y[31]}}, y[31:0]}; + end else begin + a = srca; + b = srcb; + result = y; + end + end endmodule diff --git a/pipelined/src/fpu/cvtfp.sv b/pipelined/src/fpu/cvtfp.sv index 52c441481..0b91b82e4 100644 --- a/pipelined/src/fpu/cvtfp.sv +++ b/pipelined/src/fpu/cvtfp.sv @@ -157,7 +157,7 @@ module cvtfp ( // Result Selection /////////////////////////////////////////////////////////////////////////////// - generate if(`IEEE754) begin + if(`IEEE754) begin // select the double to single precision result assign DSRes = XNaNE ? {XSgnE, {8{1'b1}}, 1'b1, XManE[50:29]} : Underflow & ~Denorm ? {XSgnE, 30'b0, CalcPlus1&(|FrmE[1:0]|Shift)} : @@ -178,8 +178,6 @@ module cvtfp ( // select the final result based on the opperation assign CvtFpResE = FmtE ? {{32{1'b1}},DSRes} : {XSgnE&~XNaNE, SDExp, SDFrac[51]|XNaNE, SDFrac[50:0]&{51{~XNaNE}}}; end - endgenerate - endmodule // fpadd diff --git a/pipelined/src/fpu/divconv_pipe.sv b/pipelined/src/fpu/divconv_pipe.sv index 4f898946d..7727e69f2 100755 --- a/pipelined/src/fpu/divconv_pipe.sv +++ b/pipelined/src/fpu/divconv_pipe.sv @@ -185,11 +185,9 @@ module csa #(parameter WIDTH=8) ( /* logic [WIDTH:0] carry_temp; genvar i; - generate - for (i=0;i