Add iCE40 SB_SPRAM256KA simulation model
authorClifford Wolf <clifford@clifford.at>
Mon, 10 Sep 2018 09:57:24 +0000 (11:57 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 10 Sep 2018 09:57:24 +0000 (11:57 +0200)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
techlibs/ice40/cells_sim.v

index 9f73aeb075dddee019f2f71c88f2b4ffb03bdc5f..e0a07af32874d9d2b1f31c221c4a468630335ada 100644 (file)
@@ -920,19 +920,40 @@ parameter A_SIGNED = 1'b0;
 parameter B_SIGNED = 1'b0;
 endmodule
 
-(* blackbox *)
-module SB_SPRAM256KA(
+module SB_SPRAM256KA (
        input [13:0] ADDRESS,
        input [15:0] DATAIN,
        input [3:0] MASKWREN,
-       input WREN,
-       input CHIPSELECT,
-       input CLOCK,
-       input STANDBY,
-       input SLEEP,
-       input POWEROFF,
-       output [15:0] DATAOUT
+       input WREN, CHIPSELECT, CLOCK, STANDBY, SLEEP, POWEROFF,
+       output reg [15:0] DATAOUT
 );
+`ifndef BLACKBOX
+       reg [15:0] mem [0:16383];
+       wire off = SLEEP || !POWEROFF;
+       integer i;
+
+       always @(negedge POWEROFF) begin
+               for (i = 0; i <= 16383; i = i+1)
+                       mem[i] = 'bx;
+       end
+
+       always @(posedge CLOCK, posedge off) begin
+               if (off) begin
+                       DATAOUT <= 0;
+               end else
+               if (CHIPSELECT && !STANDBY && !WREN) begin
+                       DATAOUT <= mem[ADDRESS];
+               end else begin
+                       if (CHIPSELECT && !STANDBY && WREN) begin
+                               if (MASKWREN[0]) mem[ADDRESS][ 3: 0] = DATAIN[ 3: 0];
+                               if (MASKWREN[1]) mem[ADDRESS][ 7: 4] = DATAIN[ 7: 4];
+                               if (MASKWREN[2]) mem[ADDRESS][11: 8] = DATAIN[11: 8];
+                               if (MASKWREN[3]) mem[ADDRESS][15:12] = DATAIN[15:12];
+                       end
+                       DATAOUT <= 'bx;
+               end
+       end
+`endif
 endmodule
 
 (* blackbox *)