Add iCE40 components

This commit is contained in:
nickmqb 2020-10-10 17:41:00 +02:00
parent 562f8d0714
commit 005125c6ab
2 changed files with 618 additions and 0 deletions

129
lib/ice40_bb.w Normal file
View file

@ -0,0 +1,129 @@
SB_RAM40_4K blackbox(
#READ_MODE $2
#WRITE_MODE $2
#INIT_0 $256
#INIT_1 $256
#INIT_2 $256
#INIT_3 $256
#INIT_4 $256
#INIT_5 $256
#INIT_6 $256
#INIT_7 $256
#INIT_8 $256
#INIT_9 $256
#INIT_A $256
#INIT_B $256
#INIT_C $256
#INIT_D $256
#INIT_E $256
#INIT_F $256
RCLK $1
RCLKE $1
RE $1
RADDR $11
WCLK $1
WCLKE $1
WE $1
WADDR $11
WDATA $16
) {
out RDATA $16
}
SB_RAM40_4KNRNW blackbox(
#READ_MODE $2
#WRITE_MODE $2
#INIT_0 $256
#INIT_1 $256
#INIT_2 $256
#INIT_3 $256
#INIT_4 $256
#INIT_5 $256
#INIT_6 $256
#INIT_7 $256
#INIT_8 $256
#INIT_9 $256
#INIT_A $256
#INIT_B $256
#INIT_C $256
#INIT_D $256
#INIT_E $256
#INIT_F $256
RCLKN $1
RCLKE $1
RE $1
RADDR $11
WCLKN $1
WCLKE $1
WE $1
WADDR $11
WDATA $16
) {
out RDATA $16
}
SB_SPRAM256KA blackbox(
CLOCK $1
ADDRESS $14
DATAIN $16
MASKWREN $4
WREN $1
CHIPSELECT $1
STANDBY $1
SLEEP $1
POWEROFF $1
) {
out DATAOUT $16
}
SB_MAC16 blackbox(
CLK $1
CE $1
C $16
A $16
B $16
D $16
AHOLD $1
BHOLD $1
CHOLD $1
DHOLD $1
IRSTTOP $1
IRSTBOT $1
ORSTTOP $1
ORSTBOT $1
OLOADTOP $1
OLOADBOT $1
ADDSUBTOP $1
ADDSUBBOT $1
OHOLDTOP $1
OHOLDBOT $1
CI $1
ACCUMCI $1
SIGNEXTIN $1
#B_SIGNED $1
#A_SIGNED $1
#MODE_8x8 $1
#BOTADDSUB_CARRYSELECT $2
#BOTADDSUB_UPPERINPUT $1
#BOTADDSUB_LOWERINPUT $2
#BOTOUTPUT_SELECT $2
#TOPADDSUB_CARRYSELECT $2
#TOPADDSUB_UPPERINPUT $1
#TOPADDSUB_LOWERINPUT $2
#TOPOUTPUT_SELECT $2
#PIPELINE_16x16_MULT_REG2 $1
#PIPELINE_16x16_MULT_REG1 $1
#BOT_8x8_MULT_REG $1
#TOP_8x8_MULT_REG $1
#D_REG $1
#B_REG $1
#A_REG $1
#C_REG $1
#NEG_TRIGGER $1
) {
out O $32
out CO $1
out ACCUMCO $1
out SIGNEXTOUT $1
}

489
lib/ice40_hl_bb.w Normal file
View file

@ -0,0 +1,489 @@
RAM256x16(
rclk $1
wclk $1
raddr $8
waddr $8
wdata $16
we $1
#initial_data $4096
) {
out rdata := RAM.RDATA
RAM := SB_RAM40_4K(
#READ_MODE: 0
#WRITE_MODE: 0
#INIT_0: chunk(#initial_data, 0, 16)
#INIT_1: chunk(#initial_data, 1, 16)
#INIT_2: chunk(#initial_data, 2, 16)
#INIT_3: chunk(#initial_data, 3, 16)
#INIT_4: chunk(#initial_data, 4, 16)
#INIT_5: chunk(#initial_data, 5, 16)
#INIT_6: chunk(#initial_data, 6, 16)
#INIT_7: chunk(#initial_data, 7, 16)
#INIT_8: chunk(#initial_data, 8, 16)
#INIT_9: chunk(#initial_data, 9, 16)
#INIT_A: chunk(#initial_data, 10, 16)
#INIT_B: chunk(#initial_data, 11, 16)
#INIT_C: chunk(#initial_data, 12, 16)
#INIT_D: chunk(#initial_data, 13, 16)
#INIT_E: chunk(#initial_data, 14, 16)
#INIT_F: chunk(#initial_data, 15, 16)
RCLK: rclk
RCLKE: 1
RE: 1
RADDR: { 'xxx, raddr }
WCLK: wclk
WCLKE: 1
WE: we
WADDR: { 'xxx, waddr }
WDATA: wdata
)
}
RAM256x16_N(
rclk $1
wclk $1
raddr $8
waddr $8
wdata $16
we $1
#initial_data $4096
) {
out rdata := RAM.RDATA
RAM := SB_RAM40_4KNRNW(
#READ_MODE: 0
#WRITE_MODE: 0
#INIT_0: chunk(#initial_data, 0, 16)
#INIT_1: chunk(#initial_data, 1, 16)
#INIT_2: chunk(#initial_data, 2, 16)
#INIT_3: chunk(#initial_data, 3, 16)
#INIT_4: chunk(#initial_data, 4, 16)
#INIT_5: chunk(#initial_data, 5, 16)
#INIT_6: chunk(#initial_data, 6, 16)
#INIT_7: chunk(#initial_data, 7, 16)
#INIT_8: chunk(#initial_data, 8, 16)
#INIT_9: chunk(#initial_data, 9, 16)
#INIT_A: chunk(#initial_data, 10, 16)
#INIT_B: chunk(#initial_data, 11, 16)
#INIT_C: chunk(#initial_data, 12, 16)
#INIT_D: chunk(#initial_data, 13, 16)
#INIT_E: chunk(#initial_data, 14, 16)
#INIT_F: chunk(#initial_data, 15, 16)
RCLKN: rclk
RCLKE: 1
RE: 1
RADDR: { 'xxx, raddr }
WCLKN: wclk
WCLKE: 1
WE: we
WADDR: { 'xxx, waddr }
WDATA: wdata
)
}
RAM512x8(
rclk $1
wclk $1
raddr $9
waddr $9
wdata $8
we $1
#initial_data $4096
) {
rd := RAM.RDATA
out rdata := { rd[14], rd[12], rd[10], rd[8], rd[6], rd[4], rd[2], rd[0] }
#initial_data_sw := swizzle(#initial_data, 1, 2048, 4096)
RAM := SB_RAM40_4K(
#READ_MODE: 1
#WRITE_MODE: 1
#INIT_0: chunk(#initial_data_sw, 0, 16)
#INIT_1: chunk(#initial_data_sw, 1, 16)
#INIT_2: chunk(#initial_data_sw, 2, 16)
#INIT_3: chunk(#initial_data_sw, 3, 16)
#INIT_4: chunk(#initial_data_sw, 4, 16)
#INIT_5: chunk(#initial_data_sw, 5, 16)
#INIT_6: chunk(#initial_data_sw, 6, 16)
#INIT_7: chunk(#initial_data_sw, 7, 16)
#INIT_8: chunk(#initial_data_sw, 8, 16)
#INIT_9: chunk(#initial_data_sw, 9, 16)
#INIT_A: chunk(#initial_data_sw, 10, 16)
#INIT_B: chunk(#initial_data_sw, 11, 16)
#INIT_C: chunk(#initial_data_sw, 12, 16)
#INIT_D: chunk(#initial_data_sw, 13, 16)
#INIT_E: chunk(#initial_data_sw, 14, 16)
#INIT_F: chunk(#initial_data_sw, 15, 16)
RCLK: rclk
RCLKE: 1
RE: 1
RADDR: { 'xx, raddr }
WCLK: wclk
WCLKE: 1
WE: we
WADDR: { 'xx, waddr }
WDATA: {
'x, wdata[7], 'x, wdata[6], 'x, wdata[5], 'x, wdata[4],
'x, wdata[3], 'x, wdata[2], 'x, wdata[1], 'x, wdata[0]
}
)
}
RAM512x8_N(
rclk $1
wclk $1
raddr $9
waddr $9
wdata $8
we $1
#initial_data $4096
) {
rd := RAM.RDATA
out rdata := { rd[14], rd[12], rd[10], rd[8], rd[6], rd[4], rd[2], rd[0] }
#initial_data_sw := swizzle(#initial_data, 1, 2048, 4096)
RAM := SB_RAM40_4KNRNW(
#READ_MODE: 1
#WRITE_MODE: 1
#INIT_0: chunk(#initial_data_sw, 0, 16)
#INIT_1: chunk(#initial_data_sw, 1, 16)
#INIT_2: chunk(#initial_data_sw, 2, 16)
#INIT_3: chunk(#initial_data_sw, 3, 16)
#INIT_4: chunk(#initial_data_sw, 4, 16)
#INIT_5: chunk(#initial_data_sw, 5, 16)
#INIT_6: chunk(#initial_data_sw, 6, 16)
#INIT_7: chunk(#initial_data_sw, 7, 16)
#INIT_8: chunk(#initial_data_sw, 8, 16)
#INIT_9: chunk(#initial_data_sw, 9, 16)
#INIT_A: chunk(#initial_data_sw, 10, 16)
#INIT_B: chunk(#initial_data_sw, 11, 16)
#INIT_C: chunk(#initial_data_sw, 12, 16)
#INIT_D: chunk(#initial_data_sw, 13, 16)
#INIT_E: chunk(#initial_data_sw, 14, 16)
#INIT_F: chunk(#initial_data_sw, 15, 16)
RCLKN: rclk
RCLKE: 1
RE: 1
RADDR: { 'xx, raddr }
WCLKN: wclk
WCLKE: 1
WE: we
WADDR: { 'xx, waddr }
WDATA: {
'x, wdata[7], 'x, wdata[6], 'x, wdata[5], 'x, wdata[4],
'x, wdata[3], 'x, wdata[2], 'x, wdata[1], 'x, wdata[0]
}
)
}
RAM1024x4(
rclk $1
wclk $1
raddr $10
waddr $10
wdata $4
we $1
#initial_data $4096
) {
rd := RAM.RDATA
out rdata := { rd[13], rd[9], rd[5], rd[1] }
#initial_data_sw := swizzle(#initial_data, 1, 1024, 4096)
RAM := SB_RAM40_4K(
#READ_MODE: 2
#WRITE_MODE: 2
#INIT_0: chunk(#initial_data_sw, 0, 16)
#INIT_1: chunk(#initial_data_sw, 1, 16)
#INIT_2: chunk(#initial_data_sw, 2, 16)
#INIT_3: chunk(#initial_data_sw, 3, 16)
#INIT_4: chunk(#initial_data_sw, 4, 16)
#INIT_5: chunk(#initial_data_sw, 5, 16)
#INIT_6: chunk(#initial_data_sw, 6, 16)
#INIT_7: chunk(#initial_data_sw, 7, 16)
#INIT_8: chunk(#initial_data_sw, 8, 16)
#INIT_9: chunk(#initial_data_sw, 9, 16)
#INIT_A: chunk(#initial_data_sw, 10, 16)
#INIT_B: chunk(#initial_data_sw, 11, 16)
#INIT_C: chunk(#initial_data_sw, 12, 16)
#INIT_D: chunk(#initial_data_sw, 13, 16)
#INIT_E: chunk(#initial_data_sw, 14, 16)
#INIT_F: chunk(#initial_data_sw, 15, 16)
RCLK: rclk
RCLKE: 1
RE: 1
RADDR: { 'x, raddr }
WCLK: wclk
WCLKE: 1
WE: we
WADDR: { 'x, waddr }
WDATA: { 'xx, wdata[3], 'xxx, wdata[2], 'xxx, wdata[1], 'xxx, wdata[0], 'x }
)
}
RAM1024x4_N(
rclk $1
wclk $1
raddr $10
waddr $10
wdata $4
we $1
#initial_data $4096
) {
rd := RAM.RDATA
out rdata := { rd[13], rd[9], rd[5], rd[1] }
#initial_data_sw := swizzle(#initial_data, 1, 1024, 4096)
RAM := SB_RAM40_4KNRNW(
#READ_MODE: 2
#WRITE_MODE: 2
#INIT_0: chunk(#initial_data_sw, 0, 16)
#INIT_1: chunk(#initial_data_sw, 1, 16)
#INIT_2: chunk(#initial_data_sw, 2, 16)
#INIT_3: chunk(#initial_data_sw, 3, 16)
#INIT_4: chunk(#initial_data_sw, 4, 16)
#INIT_5: chunk(#initial_data_sw, 5, 16)
#INIT_6: chunk(#initial_data_sw, 6, 16)
#INIT_7: chunk(#initial_data_sw, 7, 16)
#INIT_8: chunk(#initial_data_sw, 8, 16)
#INIT_9: chunk(#initial_data_sw, 9, 16)
#INIT_A: chunk(#initial_data_sw, 10, 16)
#INIT_B: chunk(#initial_data_sw, 11, 16)
#INIT_C: chunk(#initial_data_sw, 12, 16)
#INIT_D: chunk(#initial_data_sw, 13, 16)
#INIT_E: chunk(#initial_data_sw, 14, 16)
#INIT_F: chunk(#initial_data_sw, 15, 16)
RCLKN: rclk
RCLKE: 1
RE: 1
RADDR: { 'x, raddr }
WCLKN: wclk
WCLKE: 1
WE: we
WADDR: { 'x, waddr }
WDATA: { 'xx, wdata[3], 'xxx, wdata[2], 'xxx, wdata[1], 'xxx, wdata[0], 'x }
)
}
RAM2048x2(
rclk $1
wclk $1
raddr $11
waddr $11
wdata $2
we $1
#initial_data $4096
) {
rd := RAM.RDATA
out rdata := { rd[11], rd[3] }
#initial_data_sw := swizzle(#initial_data, 1, 512, 4096)
RAM := SB_RAM40_4K(
#READ_MODE: 3
#WRITE_MODE: 3
#INIT_0: chunk(#initial_data_sw, 0, 16)
#INIT_1: chunk(#initial_data_sw, 1, 16)
#INIT_2: chunk(#initial_data_sw, 2, 16)
#INIT_3: chunk(#initial_data_sw, 3, 16)
#INIT_4: chunk(#initial_data_sw, 4, 16)
#INIT_5: chunk(#initial_data_sw, 5, 16)
#INIT_6: chunk(#initial_data_sw, 6, 16)
#INIT_7: chunk(#initial_data_sw, 7, 16)
#INIT_8: chunk(#initial_data_sw, 8, 16)
#INIT_9: chunk(#initial_data_sw, 9, 16)
#INIT_A: chunk(#initial_data_sw, 10, 16)
#INIT_B: chunk(#initial_data_sw, 11, 16)
#INIT_C: chunk(#initial_data_sw, 12, 16)
#INIT_D: chunk(#initial_data_sw, 13, 16)
#INIT_E: chunk(#initial_data_sw, 14, 16)
#INIT_F: chunk(#initial_data_sw, 15, 16)
RCLK: rclk
RCLKE: 1
RE: 1
RADDR: raddr
WCLK: wclk
WCLKE: 1
WE: we
WADDR: waddr
WDATA: { 'xxxx, wdata[1], 'xxxxxxx, wdata[0], 'xxx }
)
}
RAM2048x2_N(
rclk $1
wclk $1
raddr $11
waddr $11
wdata $2
we $1
#initial_data $4096
) {
rd := RAM.RDATA
out rdata := { rd[11], rd[3] }
#initial_data_sw := swizzle(#initial_data, 1, 512, 4096)
RAM := SB_RAM40_4KNRNW(
#READ_MODE: 3
#WRITE_MODE: 3
#INIT_0: chunk(#initial_data_sw, 0, 16)
#INIT_1: chunk(#initial_data_sw, 1, 16)
#INIT_2: chunk(#initial_data_sw, 2, 16)
#INIT_3: chunk(#initial_data_sw, 3, 16)
#INIT_4: chunk(#initial_data_sw, 4, 16)
#INIT_5: chunk(#initial_data_sw, 5, 16)
#INIT_6: chunk(#initial_data_sw, 6, 16)
#INIT_7: chunk(#initial_data_sw, 7, 16)
#INIT_8: chunk(#initial_data_sw, 8, 16)
#INIT_9: chunk(#initial_data_sw, 9, 16)
#INIT_A: chunk(#initial_data_sw, 10, 16)
#INIT_B: chunk(#initial_data_sw, 11, 16)
#INIT_C: chunk(#initial_data_sw, 12, 16)
#INIT_D: chunk(#initial_data_sw, 13, 16)
#INIT_E: chunk(#initial_data_sw, 14, 16)
#INIT_F: chunk(#initial_data_sw, 15, 16)
RCLKN: rclk
RCLKE: 1
RE: 1
RADDR: raddr
WCLKN: wclk
WCLKE: 1
WE: we
WADDR: waddr
WDATA: { 'xxxx, wdata[1], 'xxxxxxx, wdata[0], 'xxx }
)
}
RAM256K(
clk $1
addr $14
wdata $16
wmask $4
we $1
) {
out rdata := RAM.DATAOUT
RAM := SB_SPRAM256KA(
CLOCK: clk
ADDRESS: addr
DATAIN: wdata
MASKWREN: wmask
WREN: we
CHIPSELECT: '1
STANDBY: '0
SLEEP: '0
POWEROFF: '1
)
}
MUL16x16(
clk $1
a $16
b $16
) {
mac := SB_MAC16(
CLK: clk
CE: ---
C: ---
A: a
B: b
D: ---
AHOLD: '0
BHOLD: '0
CHOLD: '0
DHOLD: '0
IRSTTOP: '0
IRSTBOT: '0
ORSTTOP: '0
ORSTBOT: '0
OLOADTOP: '0
OLOADBOT: '0
ADDSUBTOP: '0
ADDSUBBOT: '0
OHOLDTOP: '0
OHOLDBOT: '0
CI: '0
ACCUMCI: '0
SIGNEXTIN: '0
#B_SIGNED: '0
#A_SIGNED: '0
#MODE_8x8: '0
#BOTADDSUB_CARRYSELECT: '00
#BOTADDSUB_UPPERINPUT: '0
#BOTADDSUB_LOWERINPUT: '00
#BOTOUTPUT_SELECT: '11
#TOPADDSUB_CARRYSELECT: '00
#TOPADDSUB_UPPERINPUT: '0
#TOPADDSUB_LOWERINPUT: '00
#TOPOUTPUT_SELECT: '11
#PIPELINE_16x16_MULT_REG2: '0
#PIPELINE_16x16_MULT_REG1: '0
#BOT_8x8_MULT_REG: '0
#TOP_8x8_MULT_REG: '0
#D_REG: '0
#B_REG: '0
#A_REG: '0
#C_REG: '0
#NEG_TRIGGER: '0
)
out o := mac.O
}
MUL16x16_SIGNED(
clk $1
a $16
b $16
) {
mac := SB_MAC16(
CLK: clk
CE: ---
C: ---
A: a
B: b
D: ---
AHOLD: '0
BHOLD: '0
CHOLD: '0
DHOLD: '0
IRSTTOP: '0
IRSTBOT: '0
ORSTTOP: '0
ORSTBOT: '0
OLOADTOP: '0
OLOADBOT: '0
ADDSUBTOP: '0
ADDSUBBOT: '0
OHOLDTOP: '0
OHOLDBOT: '0
CI: '0
ACCUMCI: '0
SIGNEXTIN: '0
#B_SIGNED: '1
#A_SIGNED: '1
#MODE_8x8: '0
#BOTADDSUB_CARRYSELECT: '00
#BOTADDSUB_UPPERINPUT: '0
#BOTADDSUB_LOWERINPUT: '00
#BOTOUTPUT_SELECT: '11
#TOPADDSUB_CARRYSELECT: '00
#TOPADDSUB_UPPERINPUT: '0
#TOPADDSUB_LOWERINPUT: '00
#TOPOUTPUT_SELECT: '11
#PIPELINE_16x16_MULT_REG2: '0
#PIPELINE_16x16_MULT_REG1: '0
#BOT_8x8_MULT_REG: '0
#TOP_8x8_MULT_REG: '0
#D_REG: '0
#B_REG: '0
#A_REG: '0
#C_REG: '0
#NEG_TRIGGER: '0
)
out o := mac.O
}