From ab2d1571bf4ef664bd6761fcfbf217b95781c20a Mon Sep 17 00:00:00 2001 From: yangshenbo Date: Fri, 13 Mar 2026 14:32:42 +0800 Subject: [PATCH] first submit --- DA4008_V1.2/case/config/0301/case0.txt | 75 + DA4008_V1.2/case/config/0301/case1.txt | 90 + DA4008_V1.2/case/config/0301/case2.txt | 87 + DA4008_V1.2/case/config/0301/case3.txt | 91 + DA4008_V1.2/case/config/0301/case4.txt | 105 + DA4008_V1.2/case/config/0305/1GHZ.txt | 5 + DA4008_V1.2/case/config/0305/flattop.txt | 43 + DA4008_V1.2/case/config/shenbo/case/case0.txt | 35 + DA4008_V1.2/case/config/shenbo/lvds/lvds0.txt | 37 + DA4008_V1.2/case/lvds/0305/lvds.txt | 164 + DA4008_V1.2/lib/tphn28hpcpgv18.v | 2509 ++++++ ...dn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v | 7600 +++++++++++++++++ DA4008_V1.2/model/DEM_Reverse.v | 30 + DA4008_V1.2/model/DEM_Reverse_64CH.v | 64 + DA4008_V1.2/model/DW_pulse_sync.v | 301 + DA4008_V1.2/model/DW_reset_sync.v | 547 ++ DA4008_V1.2/model/DW_stream_sync.v | 496 ++ DA4008_V1.2/model/DW_sync.v | 385 + DA4008_V1.2/model/LVDS_DRIVER.sv | 475 ++ DA4008_V1.2/model/SPI_DRIVER.sv | 424 + DA4008_V1.2/model/clk_gen.v | 141 + DA4008_V1.2/model/clock_tb.v | 18 + DA4008_V1.2/model/glbl.v | 71 + DA4008_V1.2/model/reset_tb.v | 41 + DA4008_V1.2/model/spi_if.sv | 14 + DA4008_V1.2/rtl/awg/awg_ctrl.v | 158 + DA4008_V1.2/rtl/awg/awg_top.sv | 180 + DA4008_V1.2/rtl/clk/clk_regfile.v | 599 ++ DA4008_V1.2/rtl/comm/pulse_generator.sv | 54 + DA4008_V1.2/rtl/comm/ramp_gen.v | 104 + DA4008_V1.2/rtl/comm/sirv_gnrl_dffs.v | 342 + DA4008_V1.2/rtl/comm/sirv_gnrl_xchecker.v | 49 + DA4008_V1.2/rtl/comm/syncer.v | 58 + DA4008_V1.2/rtl/dac_regfile/dac_regfile.v | 977 +++ DA4008_V1.2/rtl/dacif/dacif.v | 83 + DA4008_V1.2/rtl/define/chip_define.v | 15 + DA4008_V1.2/rtl/define/chip_undefine.v | 16 + .../rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v | 116 + .../rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v | 1028 +++ DA4008_V1.2/rtl/dem/DEM_PhaseSync_4008.sv | 1361 +++ DA4008_V1.2/rtl/fifo/syn_fwft_fifo.v | 203 + DA4008_V1.2/rtl/io/iopad.v | 187 + DA4008_V1.2/rtl/lvds/ulink_rx.sv | 765 ++ DA4008_V1.2/rtl/memory/bhv_spram.v | 71 + DA4008_V1.2/rtl/memory/dpram.v | 90 + DA4008_V1.2/rtl/memory/spram (copy).v | 101 + DA4008_V1.2/rtl/memory/spram.v | 101 + DA4008_V1.2/rtl/memory/sram_dmux.sv | 106 + DA4008_V1.2/rtl/memory/sram_if.sv | 58 + DA4008_V1.2/rtl/memory/tsmc_dpram.v | 172 + DA4008_V1.2/rtl/memory/xil_tdpram.v | 156 + DA4008_V1.2/rtl/rstgen/rst_gen_unit.v | 64 + DA4008_V1.2/rtl/rstgen/rst_sync.v | 29 + DA4008_V1.2/rtl/spi/spi_bus_decoder.sv | 91 + DA4008_V1.2/rtl/spi/spi_pll.v | 235 + DA4008_V1.2/rtl/spi/spi_slave.v | 106 + DA4008_V1.2/rtl/spi/spi_sys.v | 292 + DA4008_V1.2/rtl/systemregfile/systemregfile.v | 716 ++ DA4008_V1.2/rtl/top/da4008_chip_top.sv | 212 + DA4008_V1.2/rtl/top/digital_top.sv | 529 ++ DA4008_V1.2/sim/chip_top/Makefile | 72 + DA4008_V1.2/sim/chip_top/TB.sv | 390 + DA4008_V1.2/sim/chip_top/TB说明.md | 92 + DA4008_V1.2/sim/chip_top/TB说明.pdf | Bin 0 -> 228691 bytes DA4008_V1.2/sim/chip_top/backup/Makefile | 72 + .../sim/chip_top/backup/filelist_syn.f | 23 + .../sim/chip_top/backup/filelist_vlg.f | 46 + DA4008_V1.2/sim/chip_top/filelist_syn.f | 23 + DA4008_V1.2/sim/chip_top/filelist_vlg.f | 46 + DA4008_V1.2/sim/chip_top/regress.csh | 166 + DA4008_V1.2/sim/lvds/Makefile | 72 + DA4008_V1.2/sim/lvds/TB.sv | 479 ++ DA4008_V1.2/sim/lvds/filelist_vlg.f | 7 + 73 files changed, 24760 insertions(+) create mode 100644 DA4008_V1.2/case/config/0301/case0.txt create mode 100644 DA4008_V1.2/case/config/0301/case1.txt create mode 100644 DA4008_V1.2/case/config/0301/case2.txt create mode 100644 DA4008_V1.2/case/config/0301/case3.txt create mode 100644 DA4008_V1.2/case/config/0301/case4.txt create mode 100644 DA4008_V1.2/case/config/0305/1GHZ.txt create mode 100644 DA4008_V1.2/case/config/0305/flattop.txt create mode 100644 DA4008_V1.2/case/config/shenbo/case/case0.txt create mode 100644 DA4008_V1.2/case/config/shenbo/lvds/lvds0.txt create mode 100644 DA4008_V1.2/case/lvds/0305/lvds.txt create mode 100644 DA4008_V1.2/lib/tphn28hpcpgv18.v create mode 100644 DA4008_V1.2/lib/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v create mode 100644 DA4008_V1.2/model/DEM_Reverse.v create mode 100644 DA4008_V1.2/model/DEM_Reverse_64CH.v create mode 100644 DA4008_V1.2/model/DW_pulse_sync.v create mode 100644 DA4008_V1.2/model/DW_reset_sync.v create mode 100644 DA4008_V1.2/model/DW_stream_sync.v create mode 100644 DA4008_V1.2/model/DW_sync.v create mode 100644 DA4008_V1.2/model/LVDS_DRIVER.sv create mode 100644 DA4008_V1.2/model/SPI_DRIVER.sv create mode 100644 DA4008_V1.2/model/clk_gen.v create mode 100644 DA4008_V1.2/model/clock_tb.v create mode 100644 DA4008_V1.2/model/glbl.v create mode 100644 DA4008_V1.2/model/reset_tb.v create mode 100644 DA4008_V1.2/model/spi_if.sv create mode 100644 DA4008_V1.2/rtl/awg/awg_ctrl.v create mode 100644 DA4008_V1.2/rtl/awg/awg_top.sv create mode 100644 DA4008_V1.2/rtl/clk/clk_regfile.v create mode 100644 DA4008_V1.2/rtl/comm/pulse_generator.sv create mode 100644 DA4008_V1.2/rtl/comm/ramp_gen.v create mode 100644 DA4008_V1.2/rtl/comm/sirv_gnrl_dffs.v create mode 100644 DA4008_V1.2/rtl/comm/sirv_gnrl_xchecker.v create mode 100644 DA4008_V1.2/rtl/comm/syncer.v create mode 100644 DA4008_V1.2/rtl/dac_regfile/dac_regfile.v create mode 100644 DA4008_V1.2/rtl/dacif/dacif.v create mode 100644 DA4008_V1.2/rtl/define/chip_define.v create mode 100644 DA4008_V1.2/rtl/define/chip_undefine.v create mode 100644 DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v create mode 100644 DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v create mode 100644 DA4008_V1.2/rtl/dem/DEM_PhaseSync_4008.sv create mode 100644 DA4008_V1.2/rtl/fifo/syn_fwft_fifo.v create mode 100644 DA4008_V1.2/rtl/io/iopad.v create mode 100644 DA4008_V1.2/rtl/lvds/ulink_rx.sv create mode 100644 DA4008_V1.2/rtl/memory/bhv_spram.v create mode 100644 DA4008_V1.2/rtl/memory/dpram.v create mode 100644 DA4008_V1.2/rtl/memory/spram (copy).v create mode 100644 DA4008_V1.2/rtl/memory/spram.v create mode 100644 DA4008_V1.2/rtl/memory/sram_dmux.sv create mode 100644 DA4008_V1.2/rtl/memory/sram_if.sv create mode 100644 DA4008_V1.2/rtl/memory/tsmc_dpram.v create mode 100644 DA4008_V1.2/rtl/memory/xil_tdpram.v create mode 100644 DA4008_V1.2/rtl/rstgen/rst_gen_unit.v create mode 100644 DA4008_V1.2/rtl/rstgen/rst_sync.v create mode 100644 DA4008_V1.2/rtl/spi/spi_bus_decoder.sv create mode 100644 DA4008_V1.2/rtl/spi/spi_pll.v create mode 100644 DA4008_V1.2/rtl/spi/spi_slave.v create mode 100644 DA4008_V1.2/rtl/spi/spi_sys.v create mode 100644 DA4008_V1.2/rtl/systemregfile/systemregfile.v create mode 100644 DA4008_V1.2/rtl/top/da4008_chip_top.sv create mode 100644 DA4008_V1.2/rtl/top/digital_top.sv create mode 100644 DA4008_V1.2/sim/chip_top/Makefile create mode 100644 DA4008_V1.2/sim/chip_top/TB.sv create mode 100644 DA4008_V1.2/sim/chip_top/TB说明.md create mode 100644 DA4008_V1.2/sim/chip_top/TB说明.pdf create mode 100644 DA4008_V1.2/sim/chip_top/backup/Makefile create mode 100644 DA4008_V1.2/sim/chip_top/backup/filelist_syn.f create mode 100644 DA4008_V1.2/sim/chip_top/backup/filelist_vlg.f create mode 100644 DA4008_V1.2/sim/chip_top/filelist_syn.f create mode 100644 DA4008_V1.2/sim/chip_top/filelist_vlg.f create mode 100644 DA4008_V1.2/sim/chip_top/regress.csh create mode 100644 DA4008_V1.2/sim/lvds/Makefile create mode 100644 DA4008_V1.2/sim/lvds/TB.sv create mode 100644 DA4008_V1.2/sim/lvds/filelist_vlg.f diff --git a/DA4008_V1.2/case/config/0301/case0.txt b/DA4008_V1.2/case/config/0301/case0.txt new file mode 100644 index 0000000..2fb4093 --- /dev/null +++ b/DA4008_V1.2/case/config/0301/case0.txt @@ -0,0 +1,75 @@ +00100000 +00100010 +0C000004 +08000004 +10008001 +8000000a + +00200000 +00100100 +03020100 +07060504 +0b0a0908 +0f0e0d0c +13121110 +17161514 +1b1a1918 +1f1e1d1c +23222120 +27262524 +2b2a2928 +2f2e2d2c +33323130 +37363534 +3b3a3938 +3f3e3d3c +43424140 +47464544 +4b4a4948 +4f4e4d4c +53525150 +57565554 +5b5a5958 +5f5e5d5c +63626160 +67666564 +6b6a6968 +6f6e6d6c +73727170 +77767574 +7b7a7978 +7f7e7d7c +83828180 +87868584 +8b8a8988 +8f8e8d8c +93929190 +97969594 +9b9a9998 +9f9e9d9c +a3a2a1a0 +a7a6a5a4 +abaaa9a8 +afaeadac +b3b2b1b0 +b7b6b5b4 +bbbab9b8 +bfbebdbc +c3c2c1c0 +c7c6c5c4 +cbcac9c8 +cfcecdcc +d3d2d1d0 +d7d6d5d4 +dbdad9d8 +dfdedddc +e3e2e1e0 +e7e6e5e4 +ebeae9e8 +efeeedec +f3f2f1f0 +f7f6f5f4 +fbfaf9f8 +fffefdfc + + diff --git a/DA4008_V1.2/case/config/0301/case1.txt b/DA4008_V1.2/case/config/0301/case1.txt new file mode 100644 index 0000000..553a262 --- /dev/null +++ b/DA4008_V1.2/case/config/0301/case1.txt @@ -0,0 +1,90 @@ +00100000 +0010000c +04000004 +8000000a +10008001 + +00200000 +00100140 +00000000 +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +22222222 +ffffffff +eeeeeeee +dddddddd +cccccccc +bbbbbbbb +aaaaaaaa +99999999 +88888888 +77777777 +66666666 +55555555 +44444444 +33333333 +22222222 +11111111 +12345678 + + diff --git a/DA4008_V1.2/case/config/0301/case2.txt b/DA4008_V1.2/case/config/0301/case2.txt new file mode 100644 index 0000000..df30f3b --- /dev/null +++ b/DA4008_V1.2/case/config/0301/case2.txt @@ -0,0 +1,87 @@ +00100000 +00100008 +04000004 +10008001 + +00200000 +00100140 +00000000 +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +22222222 +ffffffff +eeeeeeee +dddddddd +cccccccc +bbbbbbbb +aaaaaaaa +99999999 +88888888 +77777777 +66666666 +55555555 +44444444 +33333333 +22222222 +11111111 +12345678 diff --git a/DA4008_V1.2/case/config/0301/case3.txt b/DA4008_V1.2/case/config/0301/case3.txt new file mode 100644 index 0000000..8d8b6c6 --- /dev/null +++ b/DA4008_V1.2/case/config/0301/case3.txt @@ -0,0 +1,91 @@ +00100000 +00100010 +04000004 +10008001 +8000000a +8000000f + +00200000 +00100140 +00000000 +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +22222222 +ffffffff +eeeeeeee +dddddddd +cccccccc +bbbbbbbb +aaaaaaaa +99999999 +88888888 +77777777 +66666666 +55555555 +44444444 +33333333 +22222222 +11111111 +12345678 + + diff --git a/DA4008_V1.2/case/config/0301/case4.txt b/DA4008_V1.2/case/config/0301/case4.txt new file mode 100644 index 0000000..cb8598a --- /dev/null +++ b/DA4008_V1.2/case/config/0301/case4.txt @@ -0,0 +1,105 @@ +00100000 +0010000c +04000004 +8000000a +00008002 + +00200000 +00100180 +00000000 +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +11111111 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +22222222 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +33333333 +44444444 +55555555 +66666666 +77777777 +88888888 +99999999 +aaaaaaaa +bbbbbbbb +cccccccc +dddddddd +eeeeeeee +ffffffff +00000000 +11111111 +22222222 +ffffffff +eeeeeeee +dddddddd +cccccccc +bbbbbbbb +aaaaaaaa +99999999 +88888888 +77777777 +66666666 +55555555 +44444444 +33333333 +22222222 +11111111 +12345678 +ffffffff +eeeeeeee +dddddddd +cccccccc +bbbbbbbb +aaaaaaaa +99999999 +88888888 +77777777 +66666666 +55555555 +44444444 +33333333 +22222222 +11111111 +98765432 + diff --git a/DA4008_V1.2/case/config/0305/1GHZ.txt b/DA4008_V1.2/case/config/0305/1GHZ.txt new file mode 100644 index 0000000..dcaed81 --- /dev/null +++ b/DA4008_V1.2/case/config/0305/1GHZ.txt @@ -0,0 +1,5 @@ +00100000 +00000004 +0c00000a + + diff --git a/DA4008_V1.2/case/config/0305/flattop.txt b/DA4008_V1.2/case/config/0305/flattop.txt new file mode 100644 index 0000000..0aa9a43 --- /dev/null +++ b/DA4008_V1.2/case/config/0305/flattop.txt @@ -0,0 +1,43 @@ +00100000 +0010000C +04000001 +800003e8 +04002001 + +00200000 +00100080 +09060300 +16130f0c +221f1c19 +2f2c2926 +3c393532 +4945423f +55524f4c +625f5c58 +6f6b6865 +7b787572 +8885827e +95928e8b +a19e9b98 +aeaba8a5 +bbb8b4b1 +c8c4c1be +bec1c4c8 +b1b4b8bb +a5a8abae +989b9ea1 +8b8e9295 +7e828588 +7275787b +65686b6f +585c5f62 +4c4f5255 +3f424549 +3235393c +26292c2f +191c1f22 +0c0f1316 +00030609 + + + diff --git a/DA4008_V1.2/case/config/shenbo/case/case0.txt b/DA4008_V1.2/case/config/shenbo/case/case0.txt new file mode 100644 index 0000000..047dd3e --- /dev/null +++ b/DA4008_V1.2/case/config/shenbo/case/case0.txt @@ -0,0 +1,35 @@ +bcbcbcbc +12340020 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +81808080 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +82828281 +82828282 +82828282 +82828282 +82828282 +82828282 +82828282 +2afef1eb diff --git a/DA4008_V1.2/case/config/shenbo/lvds/lvds0.txt b/DA4008_V1.2/case/config/shenbo/lvds/lvds0.txt new file mode 100644 index 0000000..095642a --- /dev/null +++ b/DA4008_V1.2/case/config/shenbo/lvds/lvds0.txt @@ -0,0 +1,37 @@ +00100000 +00000004 +04000002 +00200000 +00000080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +80808080 +81808080 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +81818181 +82828281 +82828282 +82828282 +82828282 +82828282 +82828282 +82828282 diff --git a/DA4008_V1.2/case/lvds/0305/lvds.txt b/DA4008_V1.2/case/lvds/0305/lvds.txt new file mode 100644 index 0000000..992accd --- /dev/null +++ b/DA4008_V1.2/case/lvds/0305/lvds.txt @@ -0,0 +1,164 @@ +bcbcbcbc +000000a0 +b9a79380 +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c7f +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c7f +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c7f +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c7f +0e192635 +02010207 +26190e07 +6c584635 +b9a79380 +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c7f +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +b9a7937f +f1e6d9ca +fdfffdf8 +d9e6f1f8 +93a7b9ca +46586c80 +0e192635 +02010207 +26190e07 +6c584635 +17738bd1 + diff --git a/DA4008_V1.2/lib/tphn28hpcpgv18.v b/DA4008_V1.2/lib/tphn28hpcpgv18.v new file mode 100644 index 0000000..916bd30 --- /dev/null +++ b/DA4008_V1.2/lib/tphn28hpcpgv18.v @@ -0,0 +1,2509 @@ +///////////////////////////////////////////////////////////////////////////////////////////// +/// TSMC Library/IP Product +/// Filename: tphn28hpcpgv18.v +/// Technology: CLN28HT +/// Product Type: Standard I/O +/// Product Name: tphn28hpcpgv18 +/// Version: 110a +//////////////////////////////////////////////////////////////////////////////////////////// +//// +/// STATEMENT OF USE +/// +/// This information contains confidential and proprietary information of TSMC. +/// No part of this information may be reproduced, transmitted, transcribed, +/// stored in a retrieval system, or translated into any human or computer +/// language, in any form or by any means, electronic, mechanical, magnetic, +/// optical, chemical, manual, or otherwise, without the prior written permission +/// of TSMC. This information was prepared for informational purpose and is for +/// use by TSMC's customers only. TSMC reserves the right to make changes in the +/// information at any time and without notice. +/// +//////////////////////////////////////////////////////////////////////////////////////////// +`timescale 1ns/10ps + +`celldefine +module PCLAMP_G (VDDESD,VSSESD); + inout VDDESD,VSSESD; + tran (VDDESD,VDDESD); + tran (VSSESD,VSSESD); +endmodule +`endcelldefine + +`celldefine +module PCLAMPC_H_G (VDDESD, VSSESD); + inout VDDESD, VSSESD; + tran (VDDESD, VDDESD); + tran (VSSESD, VSSESD); +endmodule +`endcelldefine + +`celldefine +module PCLAMPC_V_G (VDDESD, VSSESD); + inout VDDESD, VSSESD; + tran (VDDESD, VDDESD); + tran (VSSESD, VSSESD); +endmodule +`endcelldefine + +`celldefine +module PDB3A_H_G (AIO); + inout AIO; + tran (AIO,AIO); +endmodule +`endcelldefine + +`celldefine +module PDB3A_V_G (AIO); + inout AIO; + tran (AIO,AIO); +endmodule +`endcelldefine + +`celldefine +module PDB3AC_H_G (AIO); + inout AIO; + tran (AIO,AIO); +endmodule +`endcelldefine + +`celldefine +module PDB3AC_V_G (AIO); + inout AIO; + tran (AIO,AIO); +endmodule +`endcelldefine + +`celldefine +module PDDW04DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW04DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW04SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW04SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW08DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW08DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW08SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW08SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW12DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW12DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW12SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW12SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW16DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW16DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW16SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDDW16SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW04DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW04DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW04SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW04SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW08DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW08DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW08SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW08SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW12DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW12DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW12SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW12SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW16DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW16DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW16SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDUW16SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PDXOEDG_H_G (E, DS0, DS1, XIN, XOUT, XC); + input E, DS0, DS1, XIN; + output XC, XOUT; + not (XC, XOUT); + nand (XOUT, E, XIN); + pmos (DS0_tmp, DS0, 1'b0); + pmos (DS1_tmp, DS1, 1'b0); + specify + if (DS0 == 1'b0 && DS1 == 1'b0) (E => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (E => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (E => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (E => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b0) (E => XOUT)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (E => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (E => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (E => XOUT)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b0) (XIN => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (XIN => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (XIN => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (XIN => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b0) (XIN => XOUT)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (XIN => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (XIN => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (XIN => XOUT)=(0, 0); + endspecify +endmodule +`endcelldefine + +`celldefine +module PDXOEDG_V_G (E, DS0, DS1, XIN, XOUT, XC); + input E, DS0, DS1, XIN; + output XC, XOUT; + not (XC, XOUT); + nand (XOUT, E, XIN); + pmos (DS0_tmp, DS0, 1'b0); + pmos (DS1_tmp, DS1, 1'b0); + specify + if (DS0 == 1'b0 && DS1 == 1'b0) (E => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (E => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (E => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (E => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b0) (E => XOUT)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (E => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (E => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (E => XOUT)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b0) (XIN => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (XIN => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (XIN => XC)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (XIN => XC)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b0) (XIN => XOUT)=(0, 0); + if (DS0 == 1'b0 && DS1 == 1'b1) (XIN => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b0) (XIN => XOUT)=(0, 0); + if (DS0 == 1'b1 && DS1 == 1'b1) (XIN => XOUT)=(0, 0); + endspecify +endmodule +`endcelldefine + +`celldefine +module PENDCAP_G (); +endmodule +`endcelldefine + +`celldefine +module PENDCAPA_G (); +endmodule +`endcelldefine + +`celldefine +module PRCUT_G (); +endmodule +`endcelldefine + +`celldefine +module PRCUTA_G (); +endmodule +`endcelldefine + +`celldefine +module PRDW08DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW08DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW08SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW08SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW12DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW12DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW12SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW12SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW16DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW16DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW16SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRDW16SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b0, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b0, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW08DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW08DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW08SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW08SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW12DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW12DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW12SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW12SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW16DGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW16DGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW16SDGZ_H_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PRUW16SDGZ_V_G (I, OEN, REN, PAD, C); + input I, OEN, REN; + inout PAD; + output C; + + wire MG, pull_pad, pull_c; + parameter PullTime = 10000; + + bufif0 (PAD_q, I, OEN); + pmos (MG, PAD_q, 1'b0); + bufif1 (weak1, weak0) (PAD_i, 1'b1, pull_pad); + pmos (MG, PAD_i, 1'b0); + pmos (PAD, MG, 1'b0); + bufif1 (C_buf, PAD, 1'b1); + bufif1 (weak0,weak1) (C_buf, 1'b1, pull_c); + buf (C, C_buf); + not (RE, REN); + buf #(PullTime,0) (pull_pad, RE); + buf (pull_c, RE); + +`ifdef TETRAMAX +`else + always @(PAD) begin + if (PAD === 1'bx && !$test$plusargs("bus_conflict_off") && $countdrivers(PAD)) + $display("%t ++BUS CONFLICT++ : %m", $realtime); + end + + specify + (I => PAD)=(0, 0); + (OEN => PAD)=(0, 0, 0, 0, 0, 0); + (PAD => C)=(0, 0); + endspecify +`endif +endmodule +`endcelldefine + +`celldefine +module PVDD1A_H_G (AVDD); + inout AVDD; + tran (AVDD,AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1A_V_G (AVDD); + inout AVDD; + tran (AVDD,AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1AC_H_G (AVDD); + inout AVDD; + tran (AVDD,AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1AC_V_G (AVDD); + inout AVDD; + tran (AVDD,AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1ANA_H_G (AVDD); + inout AVDD; + tran (AVDD, AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1ANA_V_G (AVDD); + inout AVDD; + tran (AVDD, AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1DGZ_H_G (VDD); + inout VDD; + tran (VDD,VDD); +endmodule +`endcelldefine + +`celldefine +module PVDD1DGZ_V_G (VDD); + inout VDD; + tran (VDD,VDD); +endmodule +`endcelldefine + +`celldefine +module PVDD2ANA_H_G (AVDD); + inout AVDD; + tran (AVDD, AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD2ANA_V_G (AVDD); + inout AVDD; + tran (AVDD, AVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD2DGZ_H_G (VDDPST); + inout VDDPST; + tran (VDDPST,VDDPST); +endmodule +`endcelldefine + +`celldefine +module PVDD2DGZ_V_G (VDDPST); + inout VDDPST; + tran (VDDPST,VDDPST); +endmodule +`endcelldefine + +`celldefine +module PVDD2POC_H_G (VDDPST); + inout VDDPST; + tran (VDDPST, VDDPST); +endmodule +`endcelldefine + +`celldefine +module PVDD2POC_V_G (VDDPST); + inout VDDPST; + tran (VDDPST, VDDPST); +endmodule +`endcelldefine + +`celldefine +module PVDD3A_H_G (AVDD,TAVDD); + inout AVDD,TAVDD; + tran (AVDD,TAVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD3A_V_G (AVDD,TAVDD); + inout AVDD,TAVDD; + tran (AVDD,TAVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD3AC_H_G (AVDD,TACVDD); + inout AVDD,TACVDD; + tran (AVDD,TACVDD); +endmodule +`endcelldefine + +`celldefine +module PVDD3AC_V_G (AVDD,TACVDD); + inout AVDD,TACVDD; + tran (AVDD,TACVDD); +endmodule +`endcelldefine + +`celldefine +module PVSS1A_H_G (AVSS); + inout AVSS; + tran (AVSS,AVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS1A_V_G (AVSS); + inout AVSS; + tran (AVSS,AVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS1AC_H_G (AVSS); + inout AVSS; + tran (AVSS,AVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS1AC_V_G (AVSS); + inout AVSS; + tran (AVSS,AVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS1ANA_H_G (AVSS); + inout AVSS; + tran (AVSS, AVSS); +endmodule + +`endcelldefine + +`celldefine +module PVSS1ANA_V_G (AVSS); + inout AVSS; + tran (AVSS, AVSS); +endmodule + +`endcelldefine + +`celldefine +module PVSS1DGZ_H_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS1DGZ_V_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS2A_H_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS2A_V_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS2AC_H_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS2AC_V_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS2ANA_H_G (AVSS); + inout AVSS; + tran (AVSS, AVSS); +endmodule + +`endcelldefine + +`celldefine +module PVSS2ANA_V_G (AVSS); + inout AVSS; + tran (AVSS, AVSS); +endmodule + +`endcelldefine + +`celldefine +module PVSS2DGZ_H_G (VSSPST); + inout VSSPST; + tran (VSSPST,VSSPST); +endmodule +`endcelldefine + +`celldefine +module PVSS2DGZ_V_G (VSSPST); + inout VSSPST; + tran (VSSPST,VSSPST); +endmodule +`endcelldefine + +`celldefine +module PVSS3A_H_G (AVSS,TAVSS); + inout AVSS,TAVSS; + tran (AVSS,TAVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS3A_V_G (AVSS,TAVSS); + inout AVSS,TAVSS; + tran (AVSS,TAVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS3AC_H_G (AVSS,TACVSS); + inout AVSS,TACVSS; + tran (AVSS,TACVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS3AC_V_G (AVSS,TACVSS); + inout AVSS,TACVSS; + tran (AVSS,TACVSS); +endmodule +`endcelldefine + +`celldefine +module PVSS3DGZ_H_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + +`celldefine +module PVSS3DGZ_V_G (VSS); + inout VSS; + tran (VSS,VSS); +endmodule +`endcelldefine + diff --git a/DA4008_V1.2/lib/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v b/DA4008_V1.2/lib/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v new file mode 100644 index 0000000..ce33622 --- /dev/null +++ b/DA4008_V1.2/lib/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v @@ -0,0 +1,7600 @@ +//*#*********************************************************************************************************************/ +//*# Software : TSMC MEMORY COMPILER tsn28hpcpuhddpsram_2012.02.00.d.170a */ +//*# Technology : TSMC 28nm CMOS LOGIC High Performance Compact Mobile 1P10M HKMG CU_ELK 0.9V */ +//*# Memory Type : TSMC 28nm High Performance Compact Mobile Ultra High Density Dual Port SRAM with d127 bit cell SVT Periphery */ +//*# Library Name : tsdn28hpcpuhdb4096x128m4mw (user specify : tsdn28hpcpuhdb4096x128m4mw_170a) */ +//*# Library Version: 170a */ +//*# Generated Time : 2024/04/10, 14:02:56 */ +//*#*********************************************************************************************************************/ +//*# */ +//*# STATEMENT OF USE */ +//*# */ +//*# This information contains confidential and proprietary information of TSMC. */ +//*# No part of this information may be reproduced, transmitted, transcribed, */ +//*# stored in a retrieval system, or translated into any human or computer */ +//*# language, in any form or by any means, electronic, mechanical, magnetic, */ +//*# optical, chemical, manual, or otherwise, without the prior written permission */ +//*# of TSMC. This information was prepared for informational purpose and is for */ +//*# use by TSMC's customers only. TSMC reserves the right to make changes in the */ +//*# information at any time and without notice. */ +//*# */ +//*#*********************************************************************************************************************/ +///*******************************************************************************/ +//* Usage Limitation: PLEASE READ CAREFULLY FOR CORRECT USAGE */ +//* The model doesn't support the control enable, data, address signals */ +//* transition at positive clock edge. */ +//* Please have some timing delays between control/data/address and clock signals*/ +//* to ensure the correct behavior. */ +//* */ +//* Please be careful when using non 2^n memory. */ +//* In a non-fully decoded array, a write cycle to a nonexistent address location*/ +//* does not change the memory array contents and output remains the same. */ +//* In a non-fully decoded array, a read cycle to a nonexistent address location */ +//* does not change the memory array contents but output becomes unknown. */ +//* */ +//* In the verilog model, the behavior of unknown clock will corrupt the */ +//* memory data and make output unknown regardless of CEB signal. But in the */ +//* silicon, the unknown clock at CEB high, the memory and output data will be */ +//* held. The verilog model behavior is more conservative in this condition. */ +//* */ +//* The model doesn't identify physical column and row address */ +//* */ +//* The verilog model provides TSMC_CM_UNIT_DELAY mode for the fast function */ +//* simulation. */ +//* All timing values in the specification are not checked in the */ +//* TSMC_CM_UNIT_DELAY mode simulation. */ +//* */ +//* */ +//* */ +//* Please use the verilog simulator version with $recrem timing check support. */ +//* Some earlier simulator versions might support $recovery only, not $recrem. */ +//* */ +//* Template Version : S_01_61101 */ +//****************************************************************************** */ +//* Macro Usage : (+define[MACRO] for Verilog compiliers) */ +//* +TSMC_CM_UNIT_DELAY : Enable fast function simulation. */ +//* +no_warning : Disable all runtime warnings message from this model. */ +//* +TSMC_INITIALIZE_MEM : Initialize the memory data in verilog format. */ +//* +TSMC_INITIALIZE_FAULT : Initialize the memory fault data in verilog format. */ +//* +TSMC_NO_TESTPINS_WARNING : Disable the wrong test pins connection error */ +//* message if necessary. */ +//****************************************************************************** */ + +`resetall +`celldefine + +`timescale 1ns/1ps +`delay_mode_path +`suppress_faults +`enable_portfaults + +module tsdn28hpcpuhdb4096x128m4mw_170a + ( + RTSEL, + WTSEL, + PTSEL, + AA, + DA, + BWEBA, + WEBA,CEBA,CLK, + AB, + DB, + BWEBB, + WEBB,CEBB, + QA, + QB + ); + +// Parameter declarations +parameter N = 128; +parameter W = 4096; +parameter M = 12; +parameter RA = 10; + + wire SLP=1'b0; + wire DSLP=1'b0; + wire SD=1'b0; + input [1:0] RTSEL; + input [1:0] WTSEL; + input [1:0] PTSEL; + +// Input-Output declarations + + input [M-1:0] AA; + input [N-1:0] DA; + input [N-1:0] BWEBA; + + input WEBA; + input CEBA; + input CLK; + input [M-1:0] AB; + input [N-1:0] DB; + input [N-1:0] BWEBB; + input WEBB; + input CEBB; + output [N-1:0] QA; + output [N-1:0] QB; + +`ifdef no_warning +parameter MES_ALL = "OFF"; +`else +parameter MES_ALL = "ON"; +`endif + +`ifdef TSMC_CM_UNIT_DELAY +parameter SRAM_DELAY = 0.010; +`endif +`ifdef TSMC_INITIALIZE_MEM +parameter INITIAL_MEM_DELAY = 0.01; +`else + `ifdef TSMC_INITIALIZE_MEM_USING_DEFAULT_TASKS +parameter INITIAL_MEM_DELAY = 0.01; + `endif +`endif +`ifdef TSMC_INITIALIZE_FAULT +parameter INITIAL_FAULT_DELAY = 0.01; +`endif + +`ifdef TSMC_INITIALIZE_MEM +parameter cdeFileInit = "tsdn28hpcpuhdb4096x128m4mw_170a_initial.cde"; +`endif +`ifdef TSMC_INITIALIZE_FAULT +parameter cdeFileFault = "tsdn28hpcpuhdb4096x128m4mw_170a_fault.cde"; +`endif + +// Registers +reg invalid_aslp; +reg invalid_bslp; +reg invalid_adslp; +reg invalid_bdslp; +reg invalid_sdwk_dslp; + +reg [N-1:0] DAL; +reg [N-1:0] DBL; +reg [N-1:0] bDBL; + +reg [N-1:0] BWEBAL; +reg [N-1:0] BWEBBL; +reg [N-1:0] bBWEBBL; + +reg [M-1:0] AAL; +reg [M-1:0] ABL; + +reg WEBAL,CEBAL; +reg WEBBL,CEBBL; + +wire [N-1:0] QAL; +wire [N-1:0] QBL; + +reg valid_testpin; + + +reg valid_ck,valid_cka,valid_ckb; +reg valid_cea, valid_ceb; +reg valid_wea, valid_web; +reg valid_aa; +reg valid_ab; +reg valid_contentiona,valid_contentionb,valid_contentionc; +reg valid_da127, valid_da126, valid_da125, valid_da124, valid_da123, valid_da122, valid_da121, valid_da120, valid_da119, valid_da118, valid_da117, valid_da116, valid_da115, valid_da114, valid_da113, valid_da112, valid_da111, valid_da110, valid_da109, valid_da108, valid_da107, valid_da106, valid_da105, valid_da104, valid_da103, valid_da102, valid_da101, valid_da100, valid_da99, valid_da98, valid_da97, valid_da96, valid_da95, valid_da94, valid_da93, valid_da92, valid_da91, valid_da90, valid_da89, valid_da88, valid_da87, valid_da86, valid_da85, valid_da84, valid_da83, valid_da82, valid_da81, valid_da80, valid_da79, valid_da78, valid_da77, valid_da76, valid_da75, valid_da74, valid_da73, valid_da72, valid_da71, valid_da70, valid_da69, valid_da68, valid_da67, valid_da66, valid_da65, valid_da64, valid_da63, valid_da62, valid_da61, valid_da60, valid_da59, valid_da58, valid_da57, valid_da56, valid_da55, valid_da54, valid_da53, valid_da52, valid_da51, valid_da50, valid_da49, valid_da48, valid_da47, valid_da46, valid_da45, valid_da44, valid_da43, valid_da42, valid_da41, valid_da40, valid_da39, valid_da38, valid_da37, valid_da36, valid_da35, valid_da34, valid_da33, valid_da32, valid_da31, valid_da30, valid_da29, valid_da28, valid_da27, valid_da26, valid_da25, valid_da24, valid_da23, valid_da22, valid_da21, valid_da20, valid_da19, valid_da18, valid_da17, valid_da16, valid_da15, valid_da14, valid_da13, valid_da12, valid_da11, valid_da10, valid_da9, valid_da8, valid_da7, valid_da6, valid_da5, valid_da4, valid_da3, valid_da2, valid_da1, valid_da0; +reg valid_db127, valid_db126, valid_db125, valid_db124, valid_db123, valid_db122, valid_db121, valid_db120, valid_db119, valid_db118, valid_db117, valid_db116, valid_db115, valid_db114, valid_db113, valid_db112, valid_db111, valid_db110, valid_db109, valid_db108, valid_db107, valid_db106, valid_db105, valid_db104, valid_db103, valid_db102, valid_db101, valid_db100, valid_db99, valid_db98, valid_db97, valid_db96, valid_db95, valid_db94, valid_db93, valid_db92, valid_db91, valid_db90, valid_db89, valid_db88, valid_db87, valid_db86, valid_db85, valid_db84, valid_db83, valid_db82, valid_db81, valid_db80, valid_db79, valid_db78, valid_db77, valid_db76, valid_db75, valid_db74, valid_db73, valid_db72, valid_db71, valid_db70, valid_db69, valid_db68, valid_db67, valid_db66, valid_db65, valid_db64, valid_db63, valid_db62, valid_db61, valid_db60, valid_db59, valid_db58, valid_db57, valid_db56, valid_db55, valid_db54, valid_db53, valid_db52, valid_db51, valid_db50, valid_db49, valid_db48, valid_db47, valid_db46, valid_db45, valid_db44, valid_db43, valid_db42, valid_db41, valid_db40, valid_db39, valid_db38, valid_db37, valid_db36, valid_db35, valid_db34, valid_db33, valid_db32, valid_db31, valid_db30, valid_db29, valid_db28, valid_db27, valid_db26, valid_db25, valid_db24, valid_db23, valid_db22, valid_db21, valid_db20, valid_db19, valid_db18, valid_db17, valid_db16, valid_db15, valid_db14, valid_db13, valid_db12, valid_db11, valid_db10, valid_db9, valid_db8, valid_db7, valid_db6, valid_db5, valid_db4, valid_db3, valid_db2, valid_db1, valid_db0; +reg valid_bwa127, valid_bwa126, valid_bwa125, valid_bwa124, valid_bwa123, valid_bwa122, valid_bwa121, valid_bwa120, valid_bwa119, valid_bwa118, valid_bwa117, valid_bwa116, valid_bwa115, valid_bwa114, valid_bwa113, valid_bwa112, valid_bwa111, valid_bwa110, valid_bwa109, valid_bwa108, valid_bwa107, valid_bwa106, valid_bwa105, valid_bwa104, valid_bwa103, valid_bwa102, valid_bwa101, valid_bwa100, valid_bwa99, valid_bwa98, valid_bwa97, valid_bwa96, valid_bwa95, valid_bwa94, valid_bwa93, valid_bwa92, valid_bwa91, valid_bwa90, valid_bwa89, valid_bwa88, valid_bwa87, valid_bwa86, valid_bwa85, valid_bwa84, valid_bwa83, valid_bwa82, valid_bwa81, valid_bwa80, valid_bwa79, valid_bwa78, valid_bwa77, valid_bwa76, valid_bwa75, valid_bwa74, valid_bwa73, valid_bwa72, valid_bwa71, valid_bwa70, valid_bwa69, valid_bwa68, valid_bwa67, valid_bwa66, valid_bwa65, valid_bwa64, valid_bwa63, valid_bwa62, valid_bwa61, valid_bwa60, valid_bwa59, valid_bwa58, valid_bwa57, valid_bwa56, valid_bwa55, valid_bwa54, valid_bwa53, valid_bwa52, valid_bwa51, valid_bwa50, valid_bwa49, valid_bwa48, valid_bwa47, valid_bwa46, valid_bwa45, valid_bwa44, valid_bwa43, valid_bwa42, valid_bwa41, valid_bwa40, valid_bwa39, valid_bwa38, valid_bwa37, valid_bwa36, valid_bwa35, valid_bwa34, valid_bwa33, valid_bwa32, valid_bwa31, valid_bwa30, valid_bwa29, valid_bwa28, valid_bwa27, valid_bwa26, valid_bwa25, valid_bwa24, valid_bwa23, valid_bwa22, valid_bwa21, valid_bwa20, valid_bwa19, valid_bwa18, valid_bwa17, valid_bwa16, valid_bwa15, valid_bwa14, valid_bwa13, valid_bwa12, valid_bwa11, valid_bwa10, valid_bwa9, valid_bwa8, valid_bwa7, valid_bwa6, valid_bwa5, valid_bwa4, valid_bwa3, valid_bwa2, valid_bwa1, valid_bwa0; +reg valid_bwb127, valid_bwb126, valid_bwb125, valid_bwb124, valid_bwb123, valid_bwb122, valid_bwb121, valid_bwb120, valid_bwb119, valid_bwb118, valid_bwb117, valid_bwb116, valid_bwb115, valid_bwb114, valid_bwb113, valid_bwb112, valid_bwb111, valid_bwb110, valid_bwb109, valid_bwb108, valid_bwb107, valid_bwb106, valid_bwb105, valid_bwb104, valid_bwb103, valid_bwb102, valid_bwb101, valid_bwb100, valid_bwb99, valid_bwb98, valid_bwb97, valid_bwb96, valid_bwb95, valid_bwb94, valid_bwb93, valid_bwb92, valid_bwb91, valid_bwb90, valid_bwb89, valid_bwb88, valid_bwb87, valid_bwb86, valid_bwb85, valid_bwb84, valid_bwb83, valid_bwb82, valid_bwb81, valid_bwb80, valid_bwb79, valid_bwb78, valid_bwb77, valid_bwb76, valid_bwb75, valid_bwb74, valid_bwb73, valid_bwb72, valid_bwb71, valid_bwb70, valid_bwb69, valid_bwb68, valid_bwb67, valid_bwb66, valid_bwb65, valid_bwb64, valid_bwb63, valid_bwb62, valid_bwb61, valid_bwb60, valid_bwb59, valid_bwb58, valid_bwb57, valid_bwb56, valid_bwb55, valid_bwb54, valid_bwb53, valid_bwb52, valid_bwb51, valid_bwb50, valid_bwb49, valid_bwb48, valid_bwb47, valid_bwb46, valid_bwb45, valid_bwb44, valid_bwb43, valid_bwb42, valid_bwb41, valid_bwb40, valid_bwb39, valid_bwb38, valid_bwb37, valid_bwb36, valid_bwb35, valid_bwb34, valid_bwb33, valid_bwb32, valid_bwb31, valid_bwb30, valid_bwb29, valid_bwb28, valid_bwb27, valid_bwb26, valid_bwb25, valid_bwb24, valid_bwb23, valid_bwb22, valid_bwb21, valid_bwb20, valid_bwb19, valid_bwb18, valid_bwb17, valid_bwb16, valid_bwb15, valid_bwb14, valid_bwb13, valid_bwb12, valid_bwb11, valid_bwb10, valid_bwb9, valid_bwb8, valid_bwb7, valid_bwb6, valid_bwb5, valid_bwb4, valid_bwb3, valid_bwb2, valid_bwb1, valid_bwb0; + +reg EN; +reg RDA, RDB; + +reg RCLKA,RCLKB; + + +wire [1:0] bRTSEL; +wire [1:0] bWTSEL; +wire [1:0] bPTSEL; + + +wire [N-1:0] bBWEBA; +wire [N-1:0] bBWEBB; + +wire [N-1:0] bDA; +wire [N-1:0] bDB; + +wire [M-1:0] bAA; +wire [M-1:0] bAB; +wire [RA-1:0] rowAA; +wire [RA-1:0] rowAB; + +wire bWEBA,bWEBB; +wire bCEBA,bCEBB; +wire bCLKA,bCLKB; + +reg [N-1:0] bQA; +reg [N-1:0] bQB; + +wire bBIST; +wire WEA,WEB,CSA,CSB; +wire bAWT = 1'b0; +wire iCEBA = bCEBA; +wire iCEBB = bCEBB; +wire iCLKA = bCLKA; +wire iCLKB = bCLKB; +wire [N-1:0] iBWEBA = bBWEBA; +wire [N-1:0] iBWEBB = bBWEBB; + +wire [N-1:0] bbQA; +wire [N-1:0] bbQB; + +integer i; +integer clk_count; +integer sd_mode; + + + + +// Address Inputs +buf sAA0 (bAA[0], AA[0]); +buf sAB0 (bAB[0], AB[0]); +buf sAA1 (bAA[1], AA[1]); +buf sAB1 (bAB[1], AB[1]); +buf sAA2 (bAA[2], AA[2]); +buf sAB2 (bAB[2], AB[2]); +buf sAA3 (bAA[3], AA[3]); +buf sAB3 (bAB[3], AB[3]); +buf sAA4 (bAA[4], AA[4]); +buf sAB4 (bAB[4], AB[4]); +buf sAA5 (bAA[5], AA[5]); +buf sAB5 (bAB[5], AB[5]); +buf sAA6 (bAA[6], AA[6]); +buf sAB6 (bAB[6], AB[6]); +buf sAA7 (bAA[7], AA[7]); +buf sAB7 (bAB[7], AB[7]); +buf sAA8 (bAA[8], AA[8]); +buf sAB8 (bAB[8], AB[8]); +buf sAA9 (bAA[9], AA[9]); +buf sAB9 (bAB[9], AB[9]); +buf sAA10 (bAA[10], AA[10]); +buf sAB10 (bAB[10], AB[10]); +buf sAA11 (bAA[11], AA[11]); +buf sAB11 (bAB[11], AB[11]); +buf srAA0 (rowAA[0], AA[2]); +buf srAB0 (rowAB[0], AB[2]); +buf srAA1 (rowAA[1], AA[3]); +buf srAB1 (rowAB[1], AB[3]); +buf srAA2 (rowAA[2], AA[4]); +buf srAB2 (rowAB[2], AB[4]); +buf srAA3 (rowAA[3], AA[5]); +buf srAB3 (rowAB[3], AB[5]); +buf srAA4 (rowAA[4], AA[6]); +buf srAB4 (rowAB[4], AB[6]); +buf srAA5 (rowAA[5], AA[7]); +buf srAB5 (rowAB[5], AB[7]); +buf srAA6 (rowAA[6], AA[8]); +buf srAB6 (rowAB[6], AB[8]); +buf srAA7 (rowAA[7], AA[9]); +buf srAB7 (rowAB[7], AB[9]); +buf srAA8 (rowAA[8], AA[10]); +buf srAB8 (rowAB[8], AB[10]); +buf srAA9 (rowAA[9], AA[11]); +buf srAB9 (rowAB[9], AB[11]); + + +// Bit Write/Data Inputs +buf sDA0 (bDA[0], DA[0]); +buf sDB0 (bDB[0], DB[0]); +buf sDA1 (bDA[1], DA[1]); +buf sDB1 (bDB[1], DB[1]); +buf sDA2 (bDA[2], DA[2]); +buf sDB2 (bDB[2], DB[2]); +buf sDA3 (bDA[3], DA[3]); +buf sDB3 (bDB[3], DB[3]); +buf sDA4 (bDA[4], DA[4]); +buf sDB4 (bDB[4], DB[4]); +buf sDA5 (bDA[5], DA[5]); +buf sDB5 (bDB[5], DB[5]); +buf sDA6 (bDA[6], DA[6]); +buf sDB6 (bDB[6], DB[6]); +buf sDA7 (bDA[7], DA[7]); +buf sDB7 (bDB[7], DB[7]); +buf sDA8 (bDA[8], DA[8]); +buf sDB8 (bDB[8], DB[8]); +buf sDA9 (bDA[9], DA[9]); +buf sDB9 (bDB[9], DB[9]); +buf sDA10 (bDA[10], DA[10]); +buf sDB10 (bDB[10], DB[10]); +buf sDA11 (bDA[11], DA[11]); +buf sDB11 (bDB[11], DB[11]); +buf sDA12 (bDA[12], DA[12]); +buf sDB12 (bDB[12], DB[12]); +buf sDA13 (bDA[13], DA[13]); +buf sDB13 (bDB[13], DB[13]); +buf sDA14 (bDA[14], DA[14]); +buf sDB14 (bDB[14], DB[14]); +buf sDA15 (bDA[15], DA[15]); +buf sDB15 (bDB[15], DB[15]); +buf sDA16 (bDA[16], DA[16]); +buf sDB16 (bDB[16], DB[16]); +buf sDA17 (bDA[17], DA[17]); +buf sDB17 (bDB[17], DB[17]); +buf sDA18 (bDA[18], DA[18]); +buf sDB18 (bDB[18], DB[18]); +buf sDA19 (bDA[19], DA[19]); +buf sDB19 (bDB[19], DB[19]); +buf sDA20 (bDA[20], DA[20]); +buf sDB20 (bDB[20], DB[20]); +buf sDA21 (bDA[21], DA[21]); +buf sDB21 (bDB[21], DB[21]); +buf sDA22 (bDA[22], DA[22]); +buf sDB22 (bDB[22], DB[22]); +buf sDA23 (bDA[23], DA[23]); +buf sDB23 (bDB[23], DB[23]); +buf sDA24 (bDA[24], DA[24]); +buf sDB24 (bDB[24], DB[24]); +buf sDA25 (bDA[25], DA[25]); +buf sDB25 (bDB[25], DB[25]); +buf sDA26 (bDA[26], DA[26]); +buf sDB26 (bDB[26], DB[26]); +buf sDA27 (bDA[27], DA[27]); +buf sDB27 (bDB[27], DB[27]); +buf sDA28 (bDA[28], DA[28]); +buf sDB28 (bDB[28], DB[28]); +buf sDA29 (bDA[29], DA[29]); +buf sDB29 (bDB[29], DB[29]); +buf sDA30 (bDA[30], DA[30]); +buf sDB30 (bDB[30], DB[30]); +buf sDA31 (bDA[31], DA[31]); +buf sDB31 (bDB[31], DB[31]); +buf sDA32 (bDA[32], DA[32]); +buf sDB32 (bDB[32], DB[32]); +buf sDA33 (bDA[33], DA[33]); +buf sDB33 (bDB[33], DB[33]); +buf sDA34 (bDA[34], DA[34]); +buf sDB34 (bDB[34], DB[34]); +buf sDA35 (bDA[35], DA[35]); +buf sDB35 (bDB[35], DB[35]); +buf sDA36 (bDA[36], DA[36]); +buf sDB36 (bDB[36], DB[36]); +buf sDA37 (bDA[37], DA[37]); +buf sDB37 (bDB[37], DB[37]); +buf sDA38 (bDA[38], DA[38]); +buf sDB38 (bDB[38], DB[38]); +buf sDA39 (bDA[39], DA[39]); +buf sDB39 (bDB[39], DB[39]); +buf sDA40 (bDA[40], DA[40]); +buf sDB40 (bDB[40], DB[40]); +buf sDA41 (bDA[41], DA[41]); +buf sDB41 (bDB[41], DB[41]); +buf sDA42 (bDA[42], DA[42]); +buf sDB42 (bDB[42], DB[42]); +buf sDA43 (bDA[43], DA[43]); +buf sDB43 (bDB[43], DB[43]); +buf sDA44 (bDA[44], DA[44]); +buf sDB44 (bDB[44], DB[44]); +buf sDA45 (bDA[45], DA[45]); +buf sDB45 (bDB[45], DB[45]); +buf sDA46 (bDA[46], DA[46]); +buf sDB46 (bDB[46], DB[46]); +buf sDA47 (bDA[47], DA[47]); +buf sDB47 (bDB[47], DB[47]); +buf sDA48 (bDA[48], DA[48]); +buf sDB48 (bDB[48], DB[48]); +buf sDA49 (bDA[49], DA[49]); +buf sDB49 (bDB[49], DB[49]); +buf sDA50 (bDA[50], DA[50]); +buf sDB50 (bDB[50], DB[50]); +buf sDA51 (bDA[51], DA[51]); +buf sDB51 (bDB[51], DB[51]); +buf sDA52 (bDA[52], DA[52]); +buf sDB52 (bDB[52], DB[52]); +buf sDA53 (bDA[53], DA[53]); +buf sDB53 (bDB[53], DB[53]); +buf sDA54 (bDA[54], DA[54]); +buf sDB54 (bDB[54], DB[54]); +buf sDA55 (bDA[55], DA[55]); +buf sDB55 (bDB[55], DB[55]); +buf sDA56 (bDA[56], DA[56]); +buf sDB56 (bDB[56], DB[56]); +buf sDA57 (bDA[57], DA[57]); +buf sDB57 (bDB[57], DB[57]); +buf sDA58 (bDA[58], DA[58]); +buf sDB58 (bDB[58], DB[58]); +buf sDA59 (bDA[59], DA[59]); +buf sDB59 (bDB[59], DB[59]); +buf sDA60 (bDA[60], DA[60]); +buf sDB60 (bDB[60], DB[60]); +buf sDA61 (bDA[61], DA[61]); +buf sDB61 (bDB[61], DB[61]); +buf sDA62 (bDA[62], DA[62]); +buf sDB62 (bDB[62], DB[62]); +buf sDA63 (bDA[63], DA[63]); +buf sDB63 (bDB[63], DB[63]); +buf sDA64 (bDA[64], DA[64]); +buf sDB64 (bDB[64], DB[64]); +buf sDA65 (bDA[65], DA[65]); +buf sDB65 (bDB[65], DB[65]); +buf sDA66 (bDA[66], DA[66]); +buf sDB66 (bDB[66], DB[66]); +buf sDA67 (bDA[67], DA[67]); +buf sDB67 (bDB[67], DB[67]); +buf sDA68 (bDA[68], DA[68]); +buf sDB68 (bDB[68], DB[68]); +buf sDA69 (bDA[69], DA[69]); +buf sDB69 (bDB[69], DB[69]); +buf sDA70 (bDA[70], DA[70]); +buf sDB70 (bDB[70], DB[70]); +buf sDA71 (bDA[71], DA[71]); +buf sDB71 (bDB[71], DB[71]); +buf sDA72 (bDA[72], DA[72]); +buf sDB72 (bDB[72], DB[72]); +buf sDA73 (bDA[73], DA[73]); +buf sDB73 (bDB[73], DB[73]); +buf sDA74 (bDA[74], DA[74]); +buf sDB74 (bDB[74], DB[74]); +buf sDA75 (bDA[75], DA[75]); +buf sDB75 (bDB[75], DB[75]); +buf sDA76 (bDA[76], DA[76]); +buf sDB76 (bDB[76], DB[76]); +buf sDA77 (bDA[77], DA[77]); +buf sDB77 (bDB[77], DB[77]); +buf sDA78 (bDA[78], DA[78]); +buf sDB78 (bDB[78], DB[78]); +buf sDA79 (bDA[79], DA[79]); +buf sDB79 (bDB[79], DB[79]); +buf sDA80 (bDA[80], DA[80]); +buf sDB80 (bDB[80], DB[80]); +buf sDA81 (bDA[81], DA[81]); +buf sDB81 (bDB[81], DB[81]); +buf sDA82 (bDA[82], DA[82]); +buf sDB82 (bDB[82], DB[82]); +buf sDA83 (bDA[83], DA[83]); +buf sDB83 (bDB[83], DB[83]); +buf sDA84 (bDA[84], DA[84]); +buf sDB84 (bDB[84], DB[84]); +buf sDA85 (bDA[85], DA[85]); +buf sDB85 (bDB[85], DB[85]); +buf sDA86 (bDA[86], DA[86]); +buf sDB86 (bDB[86], DB[86]); +buf sDA87 (bDA[87], DA[87]); +buf sDB87 (bDB[87], DB[87]); +buf sDA88 (bDA[88], DA[88]); +buf sDB88 (bDB[88], DB[88]); +buf sDA89 (bDA[89], DA[89]); +buf sDB89 (bDB[89], DB[89]); +buf sDA90 (bDA[90], DA[90]); +buf sDB90 (bDB[90], DB[90]); +buf sDA91 (bDA[91], DA[91]); +buf sDB91 (bDB[91], DB[91]); +buf sDA92 (bDA[92], DA[92]); +buf sDB92 (bDB[92], DB[92]); +buf sDA93 (bDA[93], DA[93]); +buf sDB93 (bDB[93], DB[93]); +buf sDA94 (bDA[94], DA[94]); +buf sDB94 (bDB[94], DB[94]); +buf sDA95 (bDA[95], DA[95]); +buf sDB95 (bDB[95], DB[95]); +buf sDA96 (bDA[96], DA[96]); +buf sDB96 (bDB[96], DB[96]); +buf sDA97 (bDA[97], DA[97]); +buf sDB97 (bDB[97], DB[97]); +buf sDA98 (bDA[98], DA[98]); +buf sDB98 (bDB[98], DB[98]); +buf sDA99 (bDA[99], DA[99]); +buf sDB99 (bDB[99], DB[99]); +buf sDA100 (bDA[100], DA[100]); +buf sDB100 (bDB[100], DB[100]); +buf sDA101 (bDA[101], DA[101]); +buf sDB101 (bDB[101], DB[101]); +buf sDA102 (bDA[102], DA[102]); +buf sDB102 (bDB[102], DB[102]); +buf sDA103 (bDA[103], DA[103]); +buf sDB103 (bDB[103], DB[103]); +buf sDA104 (bDA[104], DA[104]); +buf sDB104 (bDB[104], DB[104]); +buf sDA105 (bDA[105], DA[105]); +buf sDB105 (bDB[105], DB[105]); +buf sDA106 (bDA[106], DA[106]); +buf sDB106 (bDB[106], DB[106]); +buf sDA107 (bDA[107], DA[107]); +buf sDB107 (bDB[107], DB[107]); +buf sDA108 (bDA[108], DA[108]); +buf sDB108 (bDB[108], DB[108]); +buf sDA109 (bDA[109], DA[109]); +buf sDB109 (bDB[109], DB[109]); +buf sDA110 (bDA[110], DA[110]); +buf sDB110 (bDB[110], DB[110]); +buf sDA111 (bDA[111], DA[111]); +buf sDB111 (bDB[111], DB[111]); +buf sDA112 (bDA[112], DA[112]); +buf sDB112 (bDB[112], DB[112]); +buf sDA113 (bDA[113], DA[113]); +buf sDB113 (bDB[113], DB[113]); +buf sDA114 (bDA[114], DA[114]); +buf sDB114 (bDB[114], DB[114]); +buf sDA115 (bDA[115], DA[115]); +buf sDB115 (bDB[115], DB[115]); +buf sDA116 (bDA[116], DA[116]); +buf sDB116 (bDB[116], DB[116]); +buf sDA117 (bDA[117], DA[117]); +buf sDB117 (bDB[117], DB[117]); +buf sDA118 (bDA[118], DA[118]); +buf sDB118 (bDB[118], DB[118]); +buf sDA119 (bDA[119], DA[119]); +buf sDB119 (bDB[119], DB[119]); +buf sDA120 (bDA[120], DA[120]); +buf sDB120 (bDB[120], DB[120]); +buf sDA121 (bDA[121], DA[121]); +buf sDB121 (bDB[121], DB[121]); +buf sDA122 (bDA[122], DA[122]); +buf sDB122 (bDB[122], DB[122]); +buf sDA123 (bDA[123], DA[123]); +buf sDB123 (bDB[123], DB[123]); +buf sDA124 (bDA[124], DA[124]); +buf sDB124 (bDB[124], DB[124]); +buf sDA125 (bDA[125], DA[125]); +buf sDB125 (bDB[125], DB[125]); +buf sDA126 (bDA[126], DA[126]); +buf sDB126 (bDB[126], DB[126]); +buf sDA127 (bDA[127], DA[127]); +buf sDB127 (bDB[127], DB[127]); + + +buf sBWEBA0 (bBWEBA[0], BWEBA[0]); +buf sBWEBB0 (bBWEBB[0], BWEBB[0]); +buf sBWEBA1 (bBWEBA[1], BWEBA[1]); +buf sBWEBB1 (bBWEBB[1], BWEBB[1]); +buf sBWEBA2 (bBWEBA[2], BWEBA[2]); +buf sBWEBB2 (bBWEBB[2], BWEBB[2]); +buf sBWEBA3 (bBWEBA[3], BWEBA[3]); +buf sBWEBB3 (bBWEBB[3], BWEBB[3]); +buf sBWEBA4 (bBWEBA[4], BWEBA[4]); +buf sBWEBB4 (bBWEBB[4], BWEBB[4]); +buf sBWEBA5 (bBWEBA[5], BWEBA[5]); +buf sBWEBB5 (bBWEBB[5], BWEBB[5]); +buf sBWEBA6 (bBWEBA[6], BWEBA[6]); +buf sBWEBB6 (bBWEBB[6], BWEBB[6]); +buf sBWEBA7 (bBWEBA[7], BWEBA[7]); +buf sBWEBB7 (bBWEBB[7], BWEBB[7]); +buf sBWEBA8 (bBWEBA[8], BWEBA[8]); +buf sBWEBB8 (bBWEBB[8], BWEBB[8]); +buf sBWEBA9 (bBWEBA[9], BWEBA[9]); +buf sBWEBB9 (bBWEBB[9], BWEBB[9]); +buf sBWEBA10 (bBWEBA[10], BWEBA[10]); +buf sBWEBB10 (bBWEBB[10], BWEBB[10]); +buf sBWEBA11 (bBWEBA[11], BWEBA[11]); +buf sBWEBB11 (bBWEBB[11], BWEBB[11]); +buf sBWEBA12 (bBWEBA[12], BWEBA[12]); +buf sBWEBB12 (bBWEBB[12], BWEBB[12]); +buf sBWEBA13 (bBWEBA[13], BWEBA[13]); +buf sBWEBB13 (bBWEBB[13], BWEBB[13]); +buf sBWEBA14 (bBWEBA[14], BWEBA[14]); +buf sBWEBB14 (bBWEBB[14], BWEBB[14]); +buf sBWEBA15 (bBWEBA[15], BWEBA[15]); +buf sBWEBB15 (bBWEBB[15], BWEBB[15]); +buf sBWEBA16 (bBWEBA[16], BWEBA[16]); +buf sBWEBB16 (bBWEBB[16], BWEBB[16]); +buf sBWEBA17 (bBWEBA[17], BWEBA[17]); +buf sBWEBB17 (bBWEBB[17], BWEBB[17]); +buf sBWEBA18 (bBWEBA[18], BWEBA[18]); +buf sBWEBB18 (bBWEBB[18], BWEBB[18]); +buf sBWEBA19 (bBWEBA[19], BWEBA[19]); +buf sBWEBB19 (bBWEBB[19], BWEBB[19]); +buf sBWEBA20 (bBWEBA[20], BWEBA[20]); +buf sBWEBB20 (bBWEBB[20], BWEBB[20]); +buf sBWEBA21 (bBWEBA[21], BWEBA[21]); +buf sBWEBB21 (bBWEBB[21], BWEBB[21]); +buf sBWEBA22 (bBWEBA[22], BWEBA[22]); +buf sBWEBB22 (bBWEBB[22], BWEBB[22]); +buf sBWEBA23 (bBWEBA[23], BWEBA[23]); +buf sBWEBB23 (bBWEBB[23], BWEBB[23]); +buf sBWEBA24 (bBWEBA[24], BWEBA[24]); +buf sBWEBB24 (bBWEBB[24], BWEBB[24]); +buf sBWEBA25 (bBWEBA[25], BWEBA[25]); +buf sBWEBB25 (bBWEBB[25], BWEBB[25]); +buf sBWEBA26 (bBWEBA[26], BWEBA[26]); +buf sBWEBB26 (bBWEBB[26], BWEBB[26]); +buf sBWEBA27 (bBWEBA[27], BWEBA[27]); +buf sBWEBB27 (bBWEBB[27], BWEBB[27]); +buf sBWEBA28 (bBWEBA[28], BWEBA[28]); +buf sBWEBB28 (bBWEBB[28], BWEBB[28]); +buf sBWEBA29 (bBWEBA[29], BWEBA[29]); +buf sBWEBB29 (bBWEBB[29], BWEBB[29]); +buf sBWEBA30 (bBWEBA[30], BWEBA[30]); +buf sBWEBB30 (bBWEBB[30], BWEBB[30]); +buf sBWEBA31 (bBWEBA[31], BWEBA[31]); +buf sBWEBB31 (bBWEBB[31], BWEBB[31]); +buf sBWEBA32 (bBWEBA[32], BWEBA[32]); +buf sBWEBB32 (bBWEBB[32], BWEBB[32]); +buf sBWEBA33 (bBWEBA[33], BWEBA[33]); +buf sBWEBB33 (bBWEBB[33], BWEBB[33]); +buf sBWEBA34 (bBWEBA[34], BWEBA[34]); +buf sBWEBB34 (bBWEBB[34], BWEBB[34]); +buf sBWEBA35 (bBWEBA[35], BWEBA[35]); +buf sBWEBB35 (bBWEBB[35], BWEBB[35]); +buf sBWEBA36 (bBWEBA[36], BWEBA[36]); +buf sBWEBB36 (bBWEBB[36], BWEBB[36]); +buf sBWEBA37 (bBWEBA[37], BWEBA[37]); +buf sBWEBB37 (bBWEBB[37], BWEBB[37]); +buf sBWEBA38 (bBWEBA[38], BWEBA[38]); +buf sBWEBB38 (bBWEBB[38], BWEBB[38]); +buf sBWEBA39 (bBWEBA[39], BWEBA[39]); +buf sBWEBB39 (bBWEBB[39], BWEBB[39]); +buf sBWEBA40 (bBWEBA[40], BWEBA[40]); +buf sBWEBB40 (bBWEBB[40], BWEBB[40]); +buf sBWEBA41 (bBWEBA[41], BWEBA[41]); +buf sBWEBB41 (bBWEBB[41], BWEBB[41]); +buf sBWEBA42 (bBWEBA[42], BWEBA[42]); +buf sBWEBB42 (bBWEBB[42], BWEBB[42]); +buf sBWEBA43 (bBWEBA[43], BWEBA[43]); +buf sBWEBB43 (bBWEBB[43], BWEBB[43]); +buf sBWEBA44 (bBWEBA[44], BWEBA[44]); +buf sBWEBB44 (bBWEBB[44], BWEBB[44]); +buf sBWEBA45 (bBWEBA[45], BWEBA[45]); +buf sBWEBB45 (bBWEBB[45], BWEBB[45]); +buf sBWEBA46 (bBWEBA[46], BWEBA[46]); +buf sBWEBB46 (bBWEBB[46], BWEBB[46]); +buf sBWEBA47 (bBWEBA[47], BWEBA[47]); +buf sBWEBB47 (bBWEBB[47], BWEBB[47]); +buf sBWEBA48 (bBWEBA[48], BWEBA[48]); +buf sBWEBB48 (bBWEBB[48], BWEBB[48]); +buf sBWEBA49 (bBWEBA[49], BWEBA[49]); +buf sBWEBB49 (bBWEBB[49], BWEBB[49]); +buf sBWEBA50 (bBWEBA[50], BWEBA[50]); +buf sBWEBB50 (bBWEBB[50], BWEBB[50]); +buf sBWEBA51 (bBWEBA[51], BWEBA[51]); +buf sBWEBB51 (bBWEBB[51], BWEBB[51]); +buf sBWEBA52 (bBWEBA[52], BWEBA[52]); +buf sBWEBB52 (bBWEBB[52], BWEBB[52]); +buf sBWEBA53 (bBWEBA[53], BWEBA[53]); +buf sBWEBB53 (bBWEBB[53], BWEBB[53]); +buf sBWEBA54 (bBWEBA[54], BWEBA[54]); +buf sBWEBB54 (bBWEBB[54], BWEBB[54]); +buf sBWEBA55 (bBWEBA[55], BWEBA[55]); +buf sBWEBB55 (bBWEBB[55], BWEBB[55]); +buf sBWEBA56 (bBWEBA[56], BWEBA[56]); +buf sBWEBB56 (bBWEBB[56], BWEBB[56]); +buf sBWEBA57 (bBWEBA[57], BWEBA[57]); +buf sBWEBB57 (bBWEBB[57], BWEBB[57]); +buf sBWEBA58 (bBWEBA[58], BWEBA[58]); +buf sBWEBB58 (bBWEBB[58], BWEBB[58]); +buf sBWEBA59 (bBWEBA[59], BWEBA[59]); +buf sBWEBB59 (bBWEBB[59], BWEBB[59]); +buf sBWEBA60 (bBWEBA[60], BWEBA[60]); +buf sBWEBB60 (bBWEBB[60], BWEBB[60]); +buf sBWEBA61 (bBWEBA[61], BWEBA[61]); +buf sBWEBB61 (bBWEBB[61], BWEBB[61]); +buf sBWEBA62 (bBWEBA[62], BWEBA[62]); +buf sBWEBB62 (bBWEBB[62], BWEBB[62]); +buf sBWEBA63 (bBWEBA[63], BWEBA[63]); +buf sBWEBB63 (bBWEBB[63], BWEBB[63]); +buf sBWEBA64 (bBWEBA[64], BWEBA[64]); +buf sBWEBB64 (bBWEBB[64], BWEBB[64]); +buf sBWEBA65 (bBWEBA[65], BWEBA[65]); +buf sBWEBB65 (bBWEBB[65], BWEBB[65]); +buf sBWEBA66 (bBWEBA[66], BWEBA[66]); +buf sBWEBB66 (bBWEBB[66], BWEBB[66]); +buf sBWEBA67 (bBWEBA[67], BWEBA[67]); +buf sBWEBB67 (bBWEBB[67], BWEBB[67]); +buf sBWEBA68 (bBWEBA[68], BWEBA[68]); +buf sBWEBB68 (bBWEBB[68], BWEBB[68]); +buf sBWEBA69 (bBWEBA[69], BWEBA[69]); +buf sBWEBB69 (bBWEBB[69], BWEBB[69]); +buf sBWEBA70 (bBWEBA[70], BWEBA[70]); +buf sBWEBB70 (bBWEBB[70], BWEBB[70]); +buf sBWEBA71 (bBWEBA[71], BWEBA[71]); +buf sBWEBB71 (bBWEBB[71], BWEBB[71]); +buf sBWEBA72 (bBWEBA[72], BWEBA[72]); +buf sBWEBB72 (bBWEBB[72], BWEBB[72]); +buf sBWEBA73 (bBWEBA[73], BWEBA[73]); +buf sBWEBB73 (bBWEBB[73], BWEBB[73]); +buf sBWEBA74 (bBWEBA[74], BWEBA[74]); +buf sBWEBB74 (bBWEBB[74], BWEBB[74]); +buf sBWEBA75 (bBWEBA[75], BWEBA[75]); +buf sBWEBB75 (bBWEBB[75], BWEBB[75]); +buf sBWEBA76 (bBWEBA[76], BWEBA[76]); +buf sBWEBB76 (bBWEBB[76], BWEBB[76]); +buf sBWEBA77 (bBWEBA[77], BWEBA[77]); +buf sBWEBB77 (bBWEBB[77], BWEBB[77]); +buf sBWEBA78 (bBWEBA[78], BWEBA[78]); +buf sBWEBB78 (bBWEBB[78], BWEBB[78]); +buf sBWEBA79 (bBWEBA[79], BWEBA[79]); +buf sBWEBB79 (bBWEBB[79], BWEBB[79]); +buf sBWEBA80 (bBWEBA[80], BWEBA[80]); +buf sBWEBB80 (bBWEBB[80], BWEBB[80]); +buf sBWEBA81 (bBWEBA[81], BWEBA[81]); +buf sBWEBB81 (bBWEBB[81], BWEBB[81]); +buf sBWEBA82 (bBWEBA[82], BWEBA[82]); +buf sBWEBB82 (bBWEBB[82], BWEBB[82]); +buf sBWEBA83 (bBWEBA[83], BWEBA[83]); +buf sBWEBB83 (bBWEBB[83], BWEBB[83]); +buf sBWEBA84 (bBWEBA[84], BWEBA[84]); +buf sBWEBB84 (bBWEBB[84], BWEBB[84]); +buf sBWEBA85 (bBWEBA[85], BWEBA[85]); +buf sBWEBB85 (bBWEBB[85], BWEBB[85]); +buf sBWEBA86 (bBWEBA[86], BWEBA[86]); +buf sBWEBB86 (bBWEBB[86], BWEBB[86]); +buf sBWEBA87 (bBWEBA[87], BWEBA[87]); +buf sBWEBB87 (bBWEBB[87], BWEBB[87]); +buf sBWEBA88 (bBWEBA[88], BWEBA[88]); +buf sBWEBB88 (bBWEBB[88], BWEBB[88]); +buf sBWEBA89 (bBWEBA[89], BWEBA[89]); +buf sBWEBB89 (bBWEBB[89], BWEBB[89]); +buf sBWEBA90 (bBWEBA[90], BWEBA[90]); +buf sBWEBB90 (bBWEBB[90], BWEBB[90]); +buf sBWEBA91 (bBWEBA[91], BWEBA[91]); +buf sBWEBB91 (bBWEBB[91], BWEBB[91]); +buf sBWEBA92 (bBWEBA[92], BWEBA[92]); +buf sBWEBB92 (bBWEBB[92], BWEBB[92]); +buf sBWEBA93 (bBWEBA[93], BWEBA[93]); +buf sBWEBB93 (bBWEBB[93], BWEBB[93]); +buf sBWEBA94 (bBWEBA[94], BWEBA[94]); +buf sBWEBB94 (bBWEBB[94], BWEBB[94]); +buf sBWEBA95 (bBWEBA[95], BWEBA[95]); +buf sBWEBB95 (bBWEBB[95], BWEBB[95]); +buf sBWEBA96 (bBWEBA[96], BWEBA[96]); +buf sBWEBB96 (bBWEBB[96], BWEBB[96]); +buf sBWEBA97 (bBWEBA[97], BWEBA[97]); +buf sBWEBB97 (bBWEBB[97], BWEBB[97]); +buf sBWEBA98 (bBWEBA[98], BWEBA[98]); +buf sBWEBB98 (bBWEBB[98], BWEBB[98]); +buf sBWEBA99 (bBWEBA[99], BWEBA[99]); +buf sBWEBB99 (bBWEBB[99], BWEBB[99]); +buf sBWEBA100 (bBWEBA[100], BWEBA[100]); +buf sBWEBB100 (bBWEBB[100], BWEBB[100]); +buf sBWEBA101 (bBWEBA[101], BWEBA[101]); +buf sBWEBB101 (bBWEBB[101], BWEBB[101]); +buf sBWEBA102 (bBWEBA[102], BWEBA[102]); +buf sBWEBB102 (bBWEBB[102], BWEBB[102]); +buf sBWEBA103 (bBWEBA[103], BWEBA[103]); +buf sBWEBB103 (bBWEBB[103], BWEBB[103]); +buf sBWEBA104 (bBWEBA[104], BWEBA[104]); +buf sBWEBB104 (bBWEBB[104], BWEBB[104]); +buf sBWEBA105 (bBWEBA[105], BWEBA[105]); +buf sBWEBB105 (bBWEBB[105], BWEBB[105]); +buf sBWEBA106 (bBWEBA[106], BWEBA[106]); +buf sBWEBB106 (bBWEBB[106], BWEBB[106]); +buf sBWEBA107 (bBWEBA[107], BWEBA[107]); +buf sBWEBB107 (bBWEBB[107], BWEBB[107]); +buf sBWEBA108 (bBWEBA[108], BWEBA[108]); +buf sBWEBB108 (bBWEBB[108], BWEBB[108]); +buf sBWEBA109 (bBWEBA[109], BWEBA[109]); +buf sBWEBB109 (bBWEBB[109], BWEBB[109]); +buf sBWEBA110 (bBWEBA[110], BWEBA[110]); +buf sBWEBB110 (bBWEBB[110], BWEBB[110]); +buf sBWEBA111 (bBWEBA[111], BWEBA[111]); +buf sBWEBB111 (bBWEBB[111], BWEBB[111]); +buf sBWEBA112 (bBWEBA[112], BWEBA[112]); +buf sBWEBB112 (bBWEBB[112], BWEBB[112]); +buf sBWEBA113 (bBWEBA[113], BWEBA[113]); +buf sBWEBB113 (bBWEBB[113], BWEBB[113]); +buf sBWEBA114 (bBWEBA[114], BWEBA[114]); +buf sBWEBB114 (bBWEBB[114], BWEBB[114]); +buf sBWEBA115 (bBWEBA[115], BWEBA[115]); +buf sBWEBB115 (bBWEBB[115], BWEBB[115]); +buf sBWEBA116 (bBWEBA[116], BWEBA[116]); +buf sBWEBB116 (bBWEBB[116], BWEBB[116]); +buf sBWEBA117 (bBWEBA[117], BWEBA[117]); +buf sBWEBB117 (bBWEBB[117], BWEBB[117]); +buf sBWEBA118 (bBWEBA[118], BWEBA[118]); +buf sBWEBB118 (bBWEBB[118], BWEBB[118]); +buf sBWEBA119 (bBWEBA[119], BWEBA[119]); +buf sBWEBB119 (bBWEBB[119], BWEBB[119]); +buf sBWEBA120 (bBWEBA[120], BWEBA[120]); +buf sBWEBB120 (bBWEBB[120], BWEBB[120]); +buf sBWEBA121 (bBWEBA[121], BWEBA[121]); +buf sBWEBB121 (bBWEBB[121], BWEBB[121]); +buf sBWEBA122 (bBWEBA[122], BWEBA[122]); +buf sBWEBB122 (bBWEBB[122], BWEBB[122]); +buf sBWEBA123 (bBWEBA[123], BWEBA[123]); +buf sBWEBB123 (bBWEBB[123], BWEBB[123]); +buf sBWEBA124 (bBWEBA[124], BWEBA[124]); +buf sBWEBB124 (bBWEBB[124], BWEBB[124]); +buf sBWEBA125 (bBWEBA[125], BWEBA[125]); +buf sBWEBB125 (bBWEBB[125], BWEBB[125]); +buf sBWEBA126 (bBWEBA[126], BWEBA[126]); +buf sBWEBB126 (bBWEBB[126], BWEBB[126]); +buf sBWEBA127 (bBWEBA[127], BWEBA[127]); +buf sBWEBB127 (bBWEBB[127], BWEBB[127]); + + +// Input Controls +buf sWEBA (bWEBA, WEBA); +buf sWEBB (bWEBB, WEBB); +wire bSLP = 1'b0; +wire bDSLP = 1'b0; +wire bSD = 1'b0; + +buf sCEBA (bCEBA, CEBA); +buf sCEBB (bCEBB, CEBB); + +buf sCLKA (bCLKA, CLK); +buf sCLKB (bCLKB, CLK); +assign bBIST = 1'b0; + +buf sRTSEL0 (bRTSEL[0], RTSEL[0]); +buf sRTSEL1 (bRTSEL[1], RTSEL[1]); +buf sWTSEL0 (bWTSEL[0], WTSEL[0]); +buf sWTSEL1 (bWTSEL[1], WTSEL[1]); +buf sPTSEL0 (bPTSEL[0], PTSEL[0]); +buf sPTSEL1 (bPTSEL[1], PTSEL[1]); + +// Output Data +buf sQA0 (QA[0], bbQA[0]); +buf sQA1 (QA[1], bbQA[1]); +buf sQA2 (QA[2], bbQA[2]); +buf sQA3 (QA[3], bbQA[3]); +buf sQA4 (QA[4], bbQA[4]); +buf sQA5 (QA[5], bbQA[5]); +buf sQA6 (QA[6], bbQA[6]); +buf sQA7 (QA[7], bbQA[7]); +buf sQA8 (QA[8], bbQA[8]); +buf sQA9 (QA[9], bbQA[9]); +buf sQA10 (QA[10], bbQA[10]); +buf sQA11 (QA[11], bbQA[11]); +buf sQA12 (QA[12], bbQA[12]); +buf sQA13 (QA[13], bbQA[13]); +buf sQA14 (QA[14], bbQA[14]); +buf sQA15 (QA[15], bbQA[15]); +buf sQA16 (QA[16], bbQA[16]); +buf sQA17 (QA[17], bbQA[17]); +buf sQA18 (QA[18], bbQA[18]); +buf sQA19 (QA[19], bbQA[19]); +buf sQA20 (QA[20], bbQA[20]); +buf sQA21 (QA[21], bbQA[21]); +buf sQA22 (QA[22], bbQA[22]); +buf sQA23 (QA[23], bbQA[23]); +buf sQA24 (QA[24], bbQA[24]); +buf sQA25 (QA[25], bbQA[25]); +buf sQA26 (QA[26], bbQA[26]); +buf sQA27 (QA[27], bbQA[27]); +buf sQA28 (QA[28], bbQA[28]); +buf sQA29 (QA[29], bbQA[29]); +buf sQA30 (QA[30], bbQA[30]); +buf sQA31 (QA[31], bbQA[31]); +buf sQA32 (QA[32], bbQA[32]); +buf sQA33 (QA[33], bbQA[33]); +buf sQA34 (QA[34], bbQA[34]); +buf sQA35 (QA[35], bbQA[35]); +buf sQA36 (QA[36], bbQA[36]); +buf sQA37 (QA[37], bbQA[37]); +buf sQA38 (QA[38], bbQA[38]); +buf sQA39 (QA[39], bbQA[39]); +buf sQA40 (QA[40], bbQA[40]); +buf sQA41 (QA[41], bbQA[41]); +buf sQA42 (QA[42], bbQA[42]); +buf sQA43 (QA[43], bbQA[43]); +buf sQA44 (QA[44], bbQA[44]); +buf sQA45 (QA[45], bbQA[45]); +buf sQA46 (QA[46], bbQA[46]); +buf sQA47 (QA[47], bbQA[47]); +buf sQA48 (QA[48], bbQA[48]); +buf sQA49 (QA[49], bbQA[49]); +buf sQA50 (QA[50], bbQA[50]); +buf sQA51 (QA[51], bbQA[51]); +buf sQA52 (QA[52], bbQA[52]); +buf sQA53 (QA[53], bbQA[53]); +buf sQA54 (QA[54], bbQA[54]); +buf sQA55 (QA[55], bbQA[55]); +buf sQA56 (QA[56], bbQA[56]); +buf sQA57 (QA[57], bbQA[57]); +buf sQA58 (QA[58], bbQA[58]); +buf sQA59 (QA[59], bbQA[59]); +buf sQA60 (QA[60], bbQA[60]); +buf sQA61 (QA[61], bbQA[61]); +buf sQA62 (QA[62], bbQA[62]); +buf sQA63 (QA[63], bbQA[63]); +buf sQA64 (QA[64], bbQA[64]); +buf sQA65 (QA[65], bbQA[65]); +buf sQA66 (QA[66], bbQA[66]); +buf sQA67 (QA[67], bbQA[67]); +buf sQA68 (QA[68], bbQA[68]); +buf sQA69 (QA[69], bbQA[69]); +buf sQA70 (QA[70], bbQA[70]); +buf sQA71 (QA[71], bbQA[71]); +buf sQA72 (QA[72], bbQA[72]); +buf sQA73 (QA[73], bbQA[73]); +buf sQA74 (QA[74], bbQA[74]); +buf sQA75 (QA[75], bbQA[75]); +buf sQA76 (QA[76], bbQA[76]); +buf sQA77 (QA[77], bbQA[77]); +buf sQA78 (QA[78], bbQA[78]); +buf sQA79 (QA[79], bbQA[79]); +buf sQA80 (QA[80], bbQA[80]); +buf sQA81 (QA[81], bbQA[81]); +buf sQA82 (QA[82], bbQA[82]); +buf sQA83 (QA[83], bbQA[83]); +buf sQA84 (QA[84], bbQA[84]); +buf sQA85 (QA[85], bbQA[85]); +buf sQA86 (QA[86], bbQA[86]); +buf sQA87 (QA[87], bbQA[87]); +buf sQA88 (QA[88], bbQA[88]); +buf sQA89 (QA[89], bbQA[89]); +buf sQA90 (QA[90], bbQA[90]); +buf sQA91 (QA[91], bbQA[91]); +buf sQA92 (QA[92], bbQA[92]); +buf sQA93 (QA[93], bbQA[93]); +buf sQA94 (QA[94], bbQA[94]); +buf sQA95 (QA[95], bbQA[95]); +buf sQA96 (QA[96], bbQA[96]); +buf sQA97 (QA[97], bbQA[97]); +buf sQA98 (QA[98], bbQA[98]); +buf sQA99 (QA[99], bbQA[99]); +buf sQA100 (QA[100], bbQA[100]); +buf sQA101 (QA[101], bbQA[101]); +buf sQA102 (QA[102], bbQA[102]); +buf sQA103 (QA[103], bbQA[103]); +buf sQA104 (QA[104], bbQA[104]); +buf sQA105 (QA[105], bbQA[105]); +buf sQA106 (QA[106], bbQA[106]); +buf sQA107 (QA[107], bbQA[107]); +buf sQA108 (QA[108], bbQA[108]); +buf sQA109 (QA[109], bbQA[109]); +buf sQA110 (QA[110], bbQA[110]); +buf sQA111 (QA[111], bbQA[111]); +buf sQA112 (QA[112], bbQA[112]); +buf sQA113 (QA[113], bbQA[113]); +buf sQA114 (QA[114], bbQA[114]); +buf sQA115 (QA[115], bbQA[115]); +buf sQA116 (QA[116], bbQA[116]); +buf sQA117 (QA[117], bbQA[117]); +buf sQA118 (QA[118], bbQA[118]); +buf sQA119 (QA[119], bbQA[119]); +buf sQA120 (QA[120], bbQA[120]); +buf sQA121 (QA[121], bbQA[121]); +buf sQA122 (QA[122], bbQA[122]); +buf sQA123 (QA[123], bbQA[123]); +buf sQA124 (QA[124], bbQA[124]); +buf sQA125 (QA[125], bbQA[125]); +buf sQA126 (QA[126], bbQA[126]); +buf sQA127 (QA[127], bbQA[127]); + +buf sQB0 (QB[0], bbQB[0]); +buf sQB1 (QB[1], bbQB[1]); +buf sQB2 (QB[2], bbQB[2]); +buf sQB3 (QB[3], bbQB[3]); +buf sQB4 (QB[4], bbQB[4]); +buf sQB5 (QB[5], bbQB[5]); +buf sQB6 (QB[6], bbQB[6]); +buf sQB7 (QB[7], bbQB[7]); +buf sQB8 (QB[8], bbQB[8]); +buf sQB9 (QB[9], bbQB[9]); +buf sQB10 (QB[10], bbQB[10]); +buf sQB11 (QB[11], bbQB[11]); +buf sQB12 (QB[12], bbQB[12]); +buf sQB13 (QB[13], bbQB[13]); +buf sQB14 (QB[14], bbQB[14]); +buf sQB15 (QB[15], bbQB[15]); +buf sQB16 (QB[16], bbQB[16]); +buf sQB17 (QB[17], bbQB[17]); +buf sQB18 (QB[18], bbQB[18]); +buf sQB19 (QB[19], bbQB[19]); +buf sQB20 (QB[20], bbQB[20]); +buf sQB21 (QB[21], bbQB[21]); +buf sQB22 (QB[22], bbQB[22]); +buf sQB23 (QB[23], bbQB[23]); +buf sQB24 (QB[24], bbQB[24]); +buf sQB25 (QB[25], bbQB[25]); +buf sQB26 (QB[26], bbQB[26]); +buf sQB27 (QB[27], bbQB[27]); +buf sQB28 (QB[28], bbQB[28]); +buf sQB29 (QB[29], bbQB[29]); +buf sQB30 (QB[30], bbQB[30]); +buf sQB31 (QB[31], bbQB[31]); +buf sQB32 (QB[32], bbQB[32]); +buf sQB33 (QB[33], bbQB[33]); +buf sQB34 (QB[34], bbQB[34]); +buf sQB35 (QB[35], bbQB[35]); +buf sQB36 (QB[36], bbQB[36]); +buf sQB37 (QB[37], bbQB[37]); +buf sQB38 (QB[38], bbQB[38]); +buf sQB39 (QB[39], bbQB[39]); +buf sQB40 (QB[40], bbQB[40]); +buf sQB41 (QB[41], bbQB[41]); +buf sQB42 (QB[42], bbQB[42]); +buf sQB43 (QB[43], bbQB[43]); +buf sQB44 (QB[44], bbQB[44]); +buf sQB45 (QB[45], bbQB[45]); +buf sQB46 (QB[46], bbQB[46]); +buf sQB47 (QB[47], bbQB[47]); +buf sQB48 (QB[48], bbQB[48]); +buf sQB49 (QB[49], bbQB[49]); +buf sQB50 (QB[50], bbQB[50]); +buf sQB51 (QB[51], bbQB[51]); +buf sQB52 (QB[52], bbQB[52]); +buf sQB53 (QB[53], bbQB[53]); +buf sQB54 (QB[54], bbQB[54]); +buf sQB55 (QB[55], bbQB[55]); +buf sQB56 (QB[56], bbQB[56]); +buf sQB57 (QB[57], bbQB[57]); +buf sQB58 (QB[58], bbQB[58]); +buf sQB59 (QB[59], bbQB[59]); +buf sQB60 (QB[60], bbQB[60]); +buf sQB61 (QB[61], bbQB[61]); +buf sQB62 (QB[62], bbQB[62]); +buf sQB63 (QB[63], bbQB[63]); +buf sQB64 (QB[64], bbQB[64]); +buf sQB65 (QB[65], bbQB[65]); +buf sQB66 (QB[66], bbQB[66]); +buf sQB67 (QB[67], bbQB[67]); +buf sQB68 (QB[68], bbQB[68]); +buf sQB69 (QB[69], bbQB[69]); +buf sQB70 (QB[70], bbQB[70]); +buf sQB71 (QB[71], bbQB[71]); +buf sQB72 (QB[72], bbQB[72]); +buf sQB73 (QB[73], bbQB[73]); +buf sQB74 (QB[74], bbQB[74]); +buf sQB75 (QB[75], bbQB[75]); +buf sQB76 (QB[76], bbQB[76]); +buf sQB77 (QB[77], bbQB[77]); +buf sQB78 (QB[78], bbQB[78]); +buf sQB79 (QB[79], bbQB[79]); +buf sQB80 (QB[80], bbQB[80]); +buf sQB81 (QB[81], bbQB[81]); +buf sQB82 (QB[82], bbQB[82]); +buf sQB83 (QB[83], bbQB[83]); +buf sQB84 (QB[84], bbQB[84]); +buf sQB85 (QB[85], bbQB[85]); +buf sQB86 (QB[86], bbQB[86]); +buf sQB87 (QB[87], bbQB[87]); +buf sQB88 (QB[88], bbQB[88]); +buf sQB89 (QB[89], bbQB[89]); +buf sQB90 (QB[90], bbQB[90]); +buf sQB91 (QB[91], bbQB[91]); +buf sQB92 (QB[92], bbQB[92]); +buf sQB93 (QB[93], bbQB[93]); +buf sQB94 (QB[94], bbQB[94]); +buf sQB95 (QB[95], bbQB[95]); +buf sQB96 (QB[96], bbQB[96]); +buf sQB97 (QB[97], bbQB[97]); +buf sQB98 (QB[98], bbQB[98]); +buf sQB99 (QB[99], bbQB[99]); +buf sQB100 (QB[100], bbQB[100]); +buf sQB101 (QB[101], bbQB[101]); +buf sQB102 (QB[102], bbQB[102]); +buf sQB103 (QB[103], bbQB[103]); +buf sQB104 (QB[104], bbQB[104]); +buf sQB105 (QB[105], bbQB[105]); +buf sQB106 (QB[106], bbQB[106]); +buf sQB107 (QB[107], bbQB[107]); +buf sQB108 (QB[108], bbQB[108]); +buf sQB109 (QB[109], bbQB[109]); +buf sQB110 (QB[110], bbQB[110]); +buf sQB111 (QB[111], bbQB[111]); +buf sQB112 (QB[112], bbQB[112]); +buf sQB113 (QB[113], bbQB[113]); +buf sQB114 (QB[114], bbQB[114]); +buf sQB115 (QB[115], bbQB[115]); +buf sQB116 (QB[116], bbQB[116]); +buf sQB117 (QB[117], bbQB[117]); +buf sQB118 (QB[118], bbQB[118]); +buf sQB119 (QB[119], bbQB[119]); +buf sQB120 (QB[120], bbQB[120]); +buf sQB121 (QB[121], bbQB[121]); +buf sQB122 (QB[122], bbQB[122]); +buf sQB123 (QB[123], bbQB[123]); +buf sQB124 (QB[124], bbQB[124]); +buf sQB125 (QB[125], bbQB[125]); +buf sQB126 (QB[126], bbQB[126]); +buf sQB127 (QB[127], bbQB[127]); + +assign bbQA=bQA; +assign bbQB=bQB; + +//and sWEA (WEA, !bWEBA, !bCEBA); +//and sWEB (WEB, !bWEBB, !bCEBB); +assign WEA = !bSLP & !bDSLP & !bSD & !bCEBA & !bWEBA; +assign WEB = !bSLP & !bDSLP & !bSD & !bCEBB & !bWEBB; + +//buf sCSA (CSA, !bCEBA); +//buf sCSB (CSB, !bCEBB); +assign CSA = !bSLP & !bDSLP & !bSD & !bCEBA; +assign CSB = !bSLP & !bDSLP & !bSD & !bCEBB; + +wire check_noidle_b = ~CEBBL & ~bSD & ~bDSLP & ~bSLP; +wire check_idle_b = CEBBL & ~bSD & ~bDSLP & ~bSLP; +wire check_noidle_a = ~CEBAL & ~bSD & ~bDSLP & ~bSLP; +wire check_idle_a = CEBAL & ~bSD & ~bDSLP & ~bSLP; +wire check_noidle_norm_b = check_noidle_b & ~bBIST; +wire check_noidle_bist_b = check_noidle_b & bBIST; +wire check_idle_norm_b = check_idle_b & ~bBIST; +wire check_idle_bist_b = check_idle_b & bBIST; +wire check_noidle_norm_a = check_noidle_a & ~bBIST; +wire check_noidle_bist_a = check_noidle_a & bBIST; +wire check_idle_norm_a = check_idle_a & !bBIST; +wire check_idle_bist_a = check_idle_a & bBIST; + +wire check_ceb = (~iCEBA | ~iCEBB) & ~bSD & ~bDSLP & ~bSLP; +wire check_ceba = ~iCEBA & ~bSD & ~bDSLP & ~bSLP; +wire check_cebb = ~iCEBB & ~bSD & ~bDSLP & ~bSLP; +wire check_cebm = (~iCEBA | ~iCEBB) & ~bSD & ~bDSLP & ~bSLP; +wire check_ceb_a = ~iCEBA & iCEBB & ~bSD & ~bDSLP & ~bSLP; +wire check_ceb_b = iCEBA & ~iCEBB & ~bSD & ~bDSLP & ~bSLP; +wire check_ceb_ab = ~iCEBA & ~iCEBB & ~bSD & ~bDSLP & ~bSLP; + + + + + +wire check_slp = !bSD & !bDSLP; +wire check_dslp = !bSD & !bSLP; + + +`ifdef TSMC_CM_UNIT_DELAY +`else +specify + specparam PATHPULSE$ = ( 0, 0.001 ); + +specparam +tckl = 0.0875600, +tckh = 0.0875600, +tcyc = 0.8093633, + + +taas = 0.0532300, +taah = 0.0587300, +tdas = 0.0100000, +tdah = 0.0912533, +tcas = 0.0767211, +tcah = 0.0771000, +twas = 0.0714900, +twah = 0.0580700, +tbwas = 0.0100000, +tbwah = 0.0908133, + +tabs = 0.0100000, +tabh = 0.0771000, +tdbs = 0.0100000, +tdbh = 0.1276756, +tcbs = 0.0767211, +tcbh = 0.0771000, +twbs = 0.0100000, +twbh = 0.0771000, +tbwbs = 0.0100000, +tbwbh = 0.1277856, + +ttests = 0.809, +ttesth = 0.809, +tcda = 0.4335871, +tcdb = 0.8093633, +`ifdef TSMC_CM_READ_X_SQUASHING +tholda = 0.4335871, +tholdb = 0.8093633; +`else +tholda = 0.2627539, +tholdb = 0.5710583; +`endif + + $setuphold (posedge CLK &&& check_noidle_a, posedge RTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, negedge RTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, posedge RTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, negedge RTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, posedge RTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, negedge RTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, posedge RTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, negedge RTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, posedge WTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, negedge WTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, posedge WTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, negedge WTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, posedge WTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, negedge WTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, posedge WTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, negedge WTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, posedge PTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, negedge PTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, posedge PTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, negedge PTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, posedge PTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_a, negedge PTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, posedge PTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_a, negedge PTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, posedge RTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, negedge RTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, posedge RTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, negedge RTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, posedge RTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, negedge RTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, posedge RTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, negedge RTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, posedge WTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, negedge WTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, posedge WTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, negedge WTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, posedge WTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, negedge WTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, posedge WTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, negedge WTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, posedge PTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, negedge PTSEL[0], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, posedge PTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, negedge PTSEL[0], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, posedge PTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_noidle_b, negedge PTSEL[1], ttests, 0, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, posedge PTSEL[1], 0, ttesth, valid_testpin); + $setuphold (posedge CLK &&& check_idle_b, negedge PTSEL[1], 0, ttesth, valid_testpin); + + + + + + + + + + + $setuphold (posedge CLK &&& CSA, posedge AA[0], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[0], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[0], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[0], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[1], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[1], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[1], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[1], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[2], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[2], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[2], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[2], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[3], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[3], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[3], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[3], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[4], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[4], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[4], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[4], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[5], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[5], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[5], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[5], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[6], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[6], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[6], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[6], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[7], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[7], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[7], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[7], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[8], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[8], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[8], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[8], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[9], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[9], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[9], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[9], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[10], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[10], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[10], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[10], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSA, posedge AA[11], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSA, negedge AA[11], taas, taah, valid_aa); + $setuphold (posedge CLK &&& CSB, posedge AB[11], tabs, tabh, valid_ab); + $setuphold (posedge CLK &&& CSB, negedge AB[11], tabs, tabh, valid_ab); + + $setuphold (posedge CLK &&& WEA, posedge DA[0], tdas, tdah, valid_da0); + $setuphold (posedge CLK &&& WEA, negedge DA[0], tdas, tdah, valid_da0); + $setuphold (posedge CLK &&& WEB, posedge DB[0], tdbs, tdbh, valid_db0); + $setuphold (posedge CLK &&& WEB, negedge DB[0], tdbs, tdbh, valid_db0); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[0], tbwas, tbwah, valid_bwa0); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[0], tbwas, tbwah, valid_bwa0); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[0], tbwbs, tbwbh, valid_bwb0); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[0], tbwbs, tbwbh, valid_bwb0); + $setuphold (posedge CLK &&& WEA, posedge DA[1], tdas, tdah, valid_da1); + $setuphold (posedge CLK &&& WEA, negedge DA[1], tdas, tdah, valid_da1); + $setuphold (posedge CLK &&& WEB, posedge DB[1], tdbs, tdbh, valid_db1); + $setuphold (posedge CLK &&& WEB, negedge DB[1], tdbs, tdbh, valid_db1); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[1], tbwas, tbwah, valid_bwa1); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[1], tbwas, tbwah, valid_bwa1); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[1], tbwbs, tbwbh, valid_bwb1); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[1], tbwbs, tbwbh, valid_bwb1); + $setuphold (posedge CLK &&& WEA, posedge DA[2], tdas, tdah, valid_da2); + $setuphold (posedge CLK &&& WEA, negedge DA[2], tdas, tdah, valid_da2); + $setuphold (posedge CLK &&& WEB, posedge DB[2], tdbs, tdbh, valid_db2); + $setuphold (posedge CLK &&& WEB, negedge DB[2], tdbs, tdbh, valid_db2); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[2], tbwas, tbwah, valid_bwa2); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[2], tbwas, tbwah, valid_bwa2); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[2], tbwbs, tbwbh, valid_bwb2); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[2], tbwbs, tbwbh, valid_bwb2); + $setuphold (posedge CLK &&& WEA, posedge DA[3], tdas, tdah, valid_da3); + $setuphold (posedge CLK &&& WEA, negedge DA[3], tdas, tdah, valid_da3); + $setuphold (posedge CLK &&& WEB, posedge DB[3], tdbs, tdbh, valid_db3); + $setuphold (posedge CLK &&& WEB, negedge DB[3], tdbs, tdbh, valid_db3); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[3], tbwas, tbwah, valid_bwa3); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[3], tbwas, tbwah, valid_bwa3); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[3], tbwbs, tbwbh, valid_bwb3); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[3], tbwbs, tbwbh, valid_bwb3); + $setuphold (posedge CLK &&& WEA, posedge DA[4], tdas, tdah, valid_da4); + $setuphold (posedge CLK &&& WEA, negedge DA[4], tdas, tdah, valid_da4); + $setuphold (posedge CLK &&& WEB, posedge DB[4], tdbs, tdbh, valid_db4); + $setuphold (posedge CLK &&& WEB, negedge DB[4], tdbs, tdbh, valid_db4); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[4], tbwas, tbwah, valid_bwa4); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[4], tbwas, tbwah, valid_bwa4); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[4], tbwbs, tbwbh, valid_bwb4); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[4], tbwbs, tbwbh, valid_bwb4); + $setuphold (posedge CLK &&& WEA, posedge DA[5], tdas, tdah, valid_da5); + $setuphold (posedge CLK &&& WEA, negedge DA[5], tdas, tdah, valid_da5); + $setuphold (posedge CLK &&& WEB, posedge DB[5], tdbs, tdbh, valid_db5); + $setuphold (posedge CLK &&& WEB, negedge DB[5], tdbs, tdbh, valid_db5); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[5], tbwas, tbwah, valid_bwa5); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[5], tbwas, tbwah, valid_bwa5); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[5], tbwbs, tbwbh, valid_bwb5); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[5], tbwbs, tbwbh, valid_bwb5); + $setuphold (posedge CLK &&& WEA, posedge DA[6], tdas, tdah, valid_da6); + $setuphold (posedge CLK &&& WEA, negedge DA[6], tdas, tdah, valid_da6); + $setuphold (posedge CLK &&& WEB, posedge DB[6], tdbs, tdbh, valid_db6); + $setuphold (posedge CLK &&& WEB, negedge DB[6], tdbs, tdbh, valid_db6); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[6], tbwas, tbwah, valid_bwa6); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[6], tbwas, tbwah, valid_bwa6); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[6], tbwbs, tbwbh, valid_bwb6); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[6], tbwbs, tbwbh, valid_bwb6); + $setuphold (posedge CLK &&& WEA, posedge DA[7], tdas, tdah, valid_da7); + $setuphold (posedge CLK &&& WEA, negedge DA[7], tdas, tdah, valid_da7); + $setuphold (posedge CLK &&& WEB, posedge DB[7], tdbs, tdbh, valid_db7); + $setuphold (posedge CLK &&& WEB, negedge DB[7], tdbs, tdbh, valid_db7); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[7], tbwas, tbwah, valid_bwa7); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[7], tbwas, tbwah, valid_bwa7); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[7], tbwbs, tbwbh, valid_bwb7); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[7], tbwbs, tbwbh, valid_bwb7); + $setuphold (posedge CLK &&& WEA, posedge DA[8], tdas, tdah, valid_da8); + $setuphold (posedge CLK &&& WEA, negedge DA[8], tdas, tdah, valid_da8); + $setuphold (posedge CLK &&& WEB, posedge DB[8], tdbs, tdbh, valid_db8); + $setuphold (posedge CLK &&& WEB, negedge DB[8], tdbs, tdbh, valid_db8); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[8], tbwas, tbwah, valid_bwa8); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[8], tbwas, tbwah, valid_bwa8); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[8], tbwbs, tbwbh, valid_bwb8); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[8], tbwbs, tbwbh, valid_bwb8); + $setuphold (posedge CLK &&& WEA, posedge DA[9], tdas, tdah, valid_da9); + $setuphold (posedge CLK &&& WEA, negedge DA[9], tdas, tdah, valid_da9); + $setuphold (posedge CLK &&& WEB, posedge DB[9], tdbs, tdbh, valid_db9); + $setuphold (posedge CLK &&& WEB, negedge DB[9], tdbs, tdbh, valid_db9); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[9], tbwas, tbwah, valid_bwa9); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[9], tbwas, tbwah, valid_bwa9); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[9], tbwbs, tbwbh, valid_bwb9); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[9], tbwbs, tbwbh, valid_bwb9); + $setuphold (posedge CLK &&& WEA, posedge DA[10], tdas, tdah, valid_da10); + $setuphold (posedge CLK &&& WEA, negedge DA[10], tdas, tdah, valid_da10); + $setuphold (posedge CLK &&& WEB, posedge DB[10], tdbs, tdbh, valid_db10); + $setuphold (posedge CLK &&& WEB, negedge DB[10], tdbs, tdbh, valid_db10); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[10], tbwas, tbwah, valid_bwa10); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[10], tbwas, tbwah, valid_bwa10); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[10], tbwbs, tbwbh, valid_bwb10); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[10], tbwbs, tbwbh, valid_bwb10); + $setuphold (posedge CLK &&& WEA, posedge DA[11], tdas, tdah, valid_da11); + $setuphold (posedge CLK &&& WEA, negedge DA[11], tdas, tdah, valid_da11); + $setuphold (posedge CLK &&& WEB, posedge DB[11], tdbs, tdbh, valid_db11); + $setuphold (posedge CLK &&& WEB, negedge DB[11], tdbs, tdbh, valid_db11); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[11], tbwas, tbwah, valid_bwa11); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[11], tbwas, tbwah, valid_bwa11); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[11], tbwbs, tbwbh, valid_bwb11); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[11], tbwbs, tbwbh, valid_bwb11); + $setuphold (posedge CLK &&& WEA, posedge DA[12], tdas, tdah, valid_da12); + $setuphold (posedge CLK &&& WEA, negedge DA[12], tdas, tdah, valid_da12); + $setuphold (posedge CLK &&& WEB, posedge DB[12], tdbs, tdbh, valid_db12); + $setuphold (posedge CLK &&& WEB, negedge DB[12], tdbs, tdbh, valid_db12); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[12], tbwas, tbwah, valid_bwa12); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[12], tbwas, tbwah, valid_bwa12); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[12], tbwbs, tbwbh, valid_bwb12); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[12], tbwbs, tbwbh, valid_bwb12); + $setuphold (posedge CLK &&& WEA, posedge DA[13], tdas, tdah, valid_da13); + $setuphold (posedge CLK &&& WEA, negedge DA[13], tdas, tdah, valid_da13); + $setuphold (posedge CLK &&& WEB, posedge DB[13], tdbs, tdbh, valid_db13); + $setuphold (posedge CLK &&& WEB, negedge DB[13], tdbs, tdbh, valid_db13); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[13], tbwas, tbwah, valid_bwa13); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[13], tbwas, tbwah, valid_bwa13); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[13], tbwbs, tbwbh, valid_bwb13); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[13], tbwbs, tbwbh, valid_bwb13); + $setuphold (posedge CLK &&& WEA, posedge DA[14], tdas, tdah, valid_da14); + $setuphold (posedge CLK &&& WEA, negedge DA[14], tdas, tdah, valid_da14); + $setuphold (posedge CLK &&& WEB, posedge DB[14], tdbs, tdbh, valid_db14); + $setuphold (posedge CLK &&& WEB, negedge DB[14], tdbs, tdbh, valid_db14); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[14], tbwas, tbwah, valid_bwa14); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[14], tbwas, tbwah, valid_bwa14); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[14], tbwbs, tbwbh, valid_bwb14); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[14], tbwbs, tbwbh, valid_bwb14); + $setuphold (posedge CLK &&& WEA, posedge DA[15], tdas, tdah, valid_da15); + $setuphold (posedge CLK &&& WEA, negedge DA[15], tdas, tdah, valid_da15); + $setuphold (posedge CLK &&& WEB, posedge DB[15], tdbs, tdbh, valid_db15); + $setuphold (posedge CLK &&& WEB, negedge DB[15], tdbs, tdbh, valid_db15); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[15], tbwas, tbwah, valid_bwa15); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[15], tbwas, tbwah, valid_bwa15); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[15], tbwbs, tbwbh, valid_bwb15); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[15], tbwbs, tbwbh, valid_bwb15); + $setuphold (posedge CLK &&& WEA, posedge DA[16], tdas, tdah, valid_da16); + $setuphold (posedge CLK &&& WEA, negedge DA[16], tdas, tdah, valid_da16); + $setuphold (posedge CLK &&& WEB, posedge DB[16], tdbs, tdbh, valid_db16); + $setuphold (posedge CLK &&& WEB, negedge DB[16], tdbs, tdbh, valid_db16); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[16], tbwas, tbwah, valid_bwa16); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[16], tbwas, tbwah, valid_bwa16); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[16], tbwbs, tbwbh, valid_bwb16); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[16], tbwbs, tbwbh, valid_bwb16); + $setuphold (posedge CLK &&& WEA, posedge DA[17], tdas, tdah, valid_da17); + $setuphold (posedge CLK &&& WEA, negedge DA[17], tdas, tdah, valid_da17); + $setuphold (posedge CLK &&& WEB, posedge DB[17], tdbs, tdbh, valid_db17); + $setuphold (posedge CLK &&& WEB, negedge DB[17], tdbs, tdbh, valid_db17); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[17], tbwas, tbwah, valid_bwa17); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[17], tbwas, tbwah, valid_bwa17); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[17], tbwbs, tbwbh, valid_bwb17); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[17], tbwbs, tbwbh, valid_bwb17); + $setuphold (posedge CLK &&& WEA, posedge DA[18], tdas, tdah, valid_da18); + $setuphold (posedge CLK &&& WEA, negedge DA[18], tdas, tdah, valid_da18); + $setuphold (posedge CLK &&& WEB, posedge DB[18], tdbs, tdbh, valid_db18); + $setuphold (posedge CLK &&& WEB, negedge DB[18], tdbs, tdbh, valid_db18); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[18], tbwas, tbwah, valid_bwa18); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[18], tbwas, tbwah, valid_bwa18); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[18], tbwbs, tbwbh, valid_bwb18); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[18], tbwbs, tbwbh, valid_bwb18); + $setuphold (posedge CLK &&& WEA, posedge DA[19], tdas, tdah, valid_da19); + $setuphold (posedge CLK &&& WEA, negedge DA[19], tdas, tdah, valid_da19); + $setuphold (posedge CLK &&& WEB, posedge DB[19], tdbs, tdbh, valid_db19); + $setuphold (posedge CLK &&& WEB, negedge DB[19], tdbs, tdbh, valid_db19); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[19], tbwas, tbwah, valid_bwa19); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[19], tbwas, tbwah, valid_bwa19); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[19], tbwbs, tbwbh, valid_bwb19); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[19], tbwbs, tbwbh, valid_bwb19); + $setuphold (posedge CLK &&& WEA, posedge DA[20], tdas, tdah, valid_da20); + $setuphold (posedge CLK &&& WEA, negedge DA[20], tdas, tdah, valid_da20); + $setuphold (posedge CLK &&& WEB, posedge DB[20], tdbs, tdbh, valid_db20); + $setuphold (posedge CLK &&& WEB, negedge DB[20], tdbs, tdbh, valid_db20); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[20], tbwas, tbwah, valid_bwa20); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[20], tbwas, tbwah, valid_bwa20); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[20], tbwbs, tbwbh, valid_bwb20); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[20], tbwbs, tbwbh, valid_bwb20); + $setuphold (posedge CLK &&& WEA, posedge DA[21], tdas, tdah, valid_da21); + $setuphold (posedge CLK &&& WEA, negedge DA[21], tdas, tdah, valid_da21); + $setuphold (posedge CLK &&& WEB, posedge DB[21], tdbs, tdbh, valid_db21); + $setuphold (posedge CLK &&& WEB, negedge DB[21], tdbs, tdbh, valid_db21); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[21], tbwas, tbwah, valid_bwa21); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[21], tbwas, tbwah, valid_bwa21); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[21], tbwbs, tbwbh, valid_bwb21); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[21], tbwbs, tbwbh, valid_bwb21); + $setuphold (posedge CLK &&& WEA, posedge DA[22], tdas, tdah, valid_da22); + $setuphold (posedge CLK &&& WEA, negedge DA[22], tdas, tdah, valid_da22); + $setuphold (posedge CLK &&& WEB, posedge DB[22], tdbs, tdbh, valid_db22); + $setuphold (posedge CLK &&& WEB, negedge DB[22], tdbs, tdbh, valid_db22); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[22], tbwas, tbwah, valid_bwa22); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[22], tbwas, tbwah, valid_bwa22); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[22], tbwbs, tbwbh, valid_bwb22); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[22], tbwbs, tbwbh, valid_bwb22); + $setuphold (posedge CLK &&& WEA, posedge DA[23], tdas, tdah, valid_da23); + $setuphold (posedge CLK &&& WEA, negedge DA[23], tdas, tdah, valid_da23); + $setuphold (posedge CLK &&& WEB, posedge DB[23], tdbs, tdbh, valid_db23); + $setuphold (posedge CLK &&& WEB, negedge DB[23], tdbs, tdbh, valid_db23); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[23], tbwas, tbwah, valid_bwa23); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[23], tbwas, tbwah, valid_bwa23); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[23], tbwbs, tbwbh, valid_bwb23); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[23], tbwbs, tbwbh, valid_bwb23); + $setuphold (posedge CLK &&& WEA, posedge DA[24], tdas, tdah, valid_da24); + $setuphold (posedge CLK &&& WEA, negedge DA[24], tdas, tdah, valid_da24); + $setuphold (posedge CLK &&& WEB, posedge DB[24], tdbs, tdbh, valid_db24); + $setuphold (posedge CLK &&& WEB, negedge DB[24], tdbs, tdbh, valid_db24); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[24], tbwas, tbwah, valid_bwa24); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[24], tbwas, tbwah, valid_bwa24); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[24], tbwbs, tbwbh, valid_bwb24); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[24], tbwbs, tbwbh, valid_bwb24); + $setuphold (posedge CLK &&& WEA, posedge DA[25], tdas, tdah, valid_da25); + $setuphold (posedge CLK &&& WEA, negedge DA[25], tdas, tdah, valid_da25); + $setuphold (posedge CLK &&& WEB, posedge DB[25], tdbs, tdbh, valid_db25); + $setuphold (posedge CLK &&& WEB, negedge DB[25], tdbs, tdbh, valid_db25); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[25], tbwas, tbwah, valid_bwa25); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[25], tbwas, tbwah, valid_bwa25); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[25], tbwbs, tbwbh, valid_bwb25); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[25], tbwbs, tbwbh, valid_bwb25); + $setuphold (posedge CLK &&& WEA, posedge DA[26], tdas, tdah, valid_da26); + $setuphold (posedge CLK &&& WEA, negedge DA[26], tdas, tdah, valid_da26); + $setuphold (posedge CLK &&& WEB, posedge DB[26], tdbs, tdbh, valid_db26); + $setuphold (posedge CLK &&& WEB, negedge DB[26], tdbs, tdbh, valid_db26); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[26], tbwas, tbwah, valid_bwa26); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[26], tbwas, tbwah, valid_bwa26); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[26], tbwbs, tbwbh, valid_bwb26); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[26], tbwbs, tbwbh, valid_bwb26); + $setuphold (posedge CLK &&& WEA, posedge DA[27], tdas, tdah, valid_da27); + $setuphold (posedge CLK &&& WEA, negedge DA[27], tdas, tdah, valid_da27); + $setuphold (posedge CLK &&& WEB, posedge DB[27], tdbs, tdbh, valid_db27); + $setuphold (posedge CLK &&& WEB, negedge DB[27], tdbs, tdbh, valid_db27); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[27], tbwas, tbwah, valid_bwa27); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[27], tbwas, tbwah, valid_bwa27); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[27], tbwbs, tbwbh, valid_bwb27); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[27], tbwbs, tbwbh, valid_bwb27); + $setuphold (posedge CLK &&& WEA, posedge DA[28], tdas, tdah, valid_da28); + $setuphold (posedge CLK &&& WEA, negedge DA[28], tdas, tdah, valid_da28); + $setuphold (posedge CLK &&& WEB, posedge DB[28], tdbs, tdbh, valid_db28); + $setuphold (posedge CLK &&& WEB, negedge DB[28], tdbs, tdbh, valid_db28); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[28], tbwas, tbwah, valid_bwa28); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[28], tbwas, tbwah, valid_bwa28); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[28], tbwbs, tbwbh, valid_bwb28); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[28], tbwbs, tbwbh, valid_bwb28); + $setuphold (posedge CLK &&& WEA, posedge DA[29], tdas, tdah, valid_da29); + $setuphold (posedge CLK &&& WEA, negedge DA[29], tdas, tdah, valid_da29); + $setuphold (posedge CLK &&& WEB, posedge DB[29], tdbs, tdbh, valid_db29); + $setuphold (posedge CLK &&& WEB, negedge DB[29], tdbs, tdbh, valid_db29); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[29], tbwas, tbwah, valid_bwa29); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[29], tbwas, tbwah, valid_bwa29); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[29], tbwbs, tbwbh, valid_bwb29); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[29], tbwbs, tbwbh, valid_bwb29); + $setuphold (posedge CLK &&& WEA, posedge DA[30], tdas, tdah, valid_da30); + $setuphold (posedge CLK &&& WEA, negedge DA[30], tdas, tdah, valid_da30); + $setuphold (posedge CLK &&& WEB, posedge DB[30], tdbs, tdbh, valid_db30); + $setuphold (posedge CLK &&& WEB, negedge DB[30], tdbs, tdbh, valid_db30); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[30], tbwas, tbwah, valid_bwa30); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[30], tbwas, tbwah, valid_bwa30); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[30], tbwbs, tbwbh, valid_bwb30); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[30], tbwbs, tbwbh, valid_bwb30); + $setuphold (posedge CLK &&& WEA, posedge DA[31], tdas, tdah, valid_da31); + $setuphold (posedge CLK &&& WEA, negedge DA[31], tdas, tdah, valid_da31); + $setuphold (posedge CLK &&& WEB, posedge DB[31], tdbs, tdbh, valid_db31); + $setuphold (posedge CLK &&& WEB, negedge DB[31], tdbs, tdbh, valid_db31); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[31], tbwas, tbwah, valid_bwa31); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[31], tbwas, tbwah, valid_bwa31); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[31], tbwbs, tbwbh, valid_bwb31); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[31], tbwbs, tbwbh, valid_bwb31); + $setuphold (posedge CLK &&& WEA, posedge DA[32], tdas, tdah, valid_da32); + $setuphold (posedge CLK &&& WEA, negedge DA[32], tdas, tdah, valid_da32); + $setuphold (posedge CLK &&& WEB, posedge DB[32], tdbs, tdbh, valid_db32); + $setuphold (posedge CLK &&& WEB, negedge DB[32], tdbs, tdbh, valid_db32); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[32], tbwas, tbwah, valid_bwa32); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[32], tbwas, tbwah, valid_bwa32); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[32], tbwbs, tbwbh, valid_bwb32); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[32], tbwbs, tbwbh, valid_bwb32); + $setuphold (posedge CLK &&& WEA, posedge DA[33], tdas, tdah, valid_da33); + $setuphold (posedge CLK &&& WEA, negedge DA[33], tdas, tdah, valid_da33); + $setuphold (posedge CLK &&& WEB, posedge DB[33], tdbs, tdbh, valid_db33); + $setuphold (posedge CLK &&& WEB, negedge DB[33], tdbs, tdbh, valid_db33); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[33], tbwas, tbwah, valid_bwa33); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[33], tbwas, tbwah, valid_bwa33); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[33], tbwbs, tbwbh, valid_bwb33); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[33], tbwbs, tbwbh, valid_bwb33); + $setuphold (posedge CLK &&& WEA, posedge DA[34], tdas, tdah, valid_da34); + $setuphold (posedge CLK &&& WEA, negedge DA[34], tdas, tdah, valid_da34); + $setuphold (posedge CLK &&& WEB, posedge DB[34], tdbs, tdbh, valid_db34); + $setuphold (posedge CLK &&& WEB, negedge DB[34], tdbs, tdbh, valid_db34); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[34], tbwas, tbwah, valid_bwa34); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[34], tbwas, tbwah, valid_bwa34); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[34], tbwbs, tbwbh, valid_bwb34); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[34], tbwbs, tbwbh, valid_bwb34); + $setuphold (posedge CLK &&& WEA, posedge DA[35], tdas, tdah, valid_da35); + $setuphold (posedge CLK &&& WEA, negedge DA[35], tdas, tdah, valid_da35); + $setuphold (posedge CLK &&& WEB, posedge DB[35], tdbs, tdbh, valid_db35); + $setuphold (posedge CLK &&& WEB, negedge DB[35], tdbs, tdbh, valid_db35); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[35], tbwas, tbwah, valid_bwa35); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[35], tbwas, tbwah, valid_bwa35); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[35], tbwbs, tbwbh, valid_bwb35); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[35], tbwbs, tbwbh, valid_bwb35); + $setuphold (posedge CLK &&& WEA, posedge DA[36], tdas, tdah, valid_da36); + $setuphold (posedge CLK &&& WEA, negedge DA[36], tdas, tdah, valid_da36); + $setuphold (posedge CLK &&& WEB, posedge DB[36], tdbs, tdbh, valid_db36); + $setuphold (posedge CLK &&& WEB, negedge DB[36], tdbs, tdbh, valid_db36); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[36], tbwas, tbwah, valid_bwa36); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[36], tbwas, tbwah, valid_bwa36); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[36], tbwbs, tbwbh, valid_bwb36); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[36], tbwbs, tbwbh, valid_bwb36); + $setuphold (posedge CLK &&& WEA, posedge DA[37], tdas, tdah, valid_da37); + $setuphold (posedge CLK &&& WEA, negedge DA[37], tdas, tdah, valid_da37); + $setuphold (posedge CLK &&& WEB, posedge DB[37], tdbs, tdbh, valid_db37); + $setuphold (posedge CLK &&& WEB, negedge DB[37], tdbs, tdbh, valid_db37); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[37], tbwas, tbwah, valid_bwa37); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[37], tbwas, tbwah, valid_bwa37); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[37], tbwbs, tbwbh, valid_bwb37); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[37], tbwbs, tbwbh, valid_bwb37); + $setuphold (posedge CLK &&& WEA, posedge DA[38], tdas, tdah, valid_da38); + $setuphold (posedge CLK &&& WEA, negedge DA[38], tdas, tdah, valid_da38); + $setuphold (posedge CLK &&& WEB, posedge DB[38], tdbs, tdbh, valid_db38); + $setuphold (posedge CLK &&& WEB, negedge DB[38], tdbs, tdbh, valid_db38); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[38], tbwas, tbwah, valid_bwa38); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[38], tbwas, tbwah, valid_bwa38); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[38], tbwbs, tbwbh, valid_bwb38); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[38], tbwbs, tbwbh, valid_bwb38); + $setuphold (posedge CLK &&& WEA, posedge DA[39], tdas, tdah, valid_da39); + $setuphold (posedge CLK &&& WEA, negedge DA[39], tdas, tdah, valid_da39); + $setuphold (posedge CLK &&& WEB, posedge DB[39], tdbs, tdbh, valid_db39); + $setuphold (posedge CLK &&& WEB, negedge DB[39], tdbs, tdbh, valid_db39); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[39], tbwas, tbwah, valid_bwa39); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[39], tbwas, tbwah, valid_bwa39); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[39], tbwbs, tbwbh, valid_bwb39); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[39], tbwbs, tbwbh, valid_bwb39); + $setuphold (posedge CLK &&& WEA, posedge DA[40], tdas, tdah, valid_da40); + $setuphold (posedge CLK &&& WEA, negedge DA[40], tdas, tdah, valid_da40); + $setuphold (posedge CLK &&& WEB, posedge DB[40], tdbs, tdbh, valid_db40); + $setuphold (posedge CLK &&& WEB, negedge DB[40], tdbs, tdbh, valid_db40); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[40], tbwas, tbwah, valid_bwa40); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[40], tbwas, tbwah, valid_bwa40); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[40], tbwbs, tbwbh, valid_bwb40); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[40], tbwbs, tbwbh, valid_bwb40); + $setuphold (posedge CLK &&& WEA, posedge DA[41], tdas, tdah, valid_da41); + $setuphold (posedge CLK &&& WEA, negedge DA[41], tdas, tdah, valid_da41); + $setuphold (posedge CLK &&& WEB, posedge DB[41], tdbs, tdbh, valid_db41); + $setuphold (posedge CLK &&& WEB, negedge DB[41], tdbs, tdbh, valid_db41); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[41], tbwas, tbwah, valid_bwa41); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[41], tbwas, tbwah, valid_bwa41); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[41], tbwbs, tbwbh, valid_bwb41); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[41], tbwbs, tbwbh, valid_bwb41); + $setuphold (posedge CLK &&& WEA, posedge DA[42], tdas, tdah, valid_da42); + $setuphold (posedge CLK &&& WEA, negedge DA[42], tdas, tdah, valid_da42); + $setuphold (posedge CLK &&& WEB, posedge DB[42], tdbs, tdbh, valid_db42); + $setuphold (posedge CLK &&& WEB, negedge DB[42], tdbs, tdbh, valid_db42); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[42], tbwas, tbwah, valid_bwa42); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[42], tbwas, tbwah, valid_bwa42); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[42], tbwbs, tbwbh, valid_bwb42); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[42], tbwbs, tbwbh, valid_bwb42); + $setuphold (posedge CLK &&& WEA, posedge DA[43], tdas, tdah, valid_da43); + $setuphold (posedge CLK &&& WEA, negedge DA[43], tdas, tdah, valid_da43); + $setuphold (posedge CLK &&& WEB, posedge DB[43], tdbs, tdbh, valid_db43); + $setuphold (posedge CLK &&& WEB, negedge DB[43], tdbs, tdbh, valid_db43); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[43], tbwas, tbwah, valid_bwa43); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[43], tbwas, tbwah, valid_bwa43); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[43], tbwbs, tbwbh, valid_bwb43); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[43], tbwbs, tbwbh, valid_bwb43); + $setuphold (posedge CLK &&& WEA, posedge DA[44], tdas, tdah, valid_da44); + $setuphold (posedge CLK &&& WEA, negedge DA[44], tdas, tdah, valid_da44); + $setuphold (posedge CLK &&& WEB, posedge DB[44], tdbs, tdbh, valid_db44); + $setuphold (posedge CLK &&& WEB, negedge DB[44], tdbs, tdbh, valid_db44); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[44], tbwas, tbwah, valid_bwa44); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[44], tbwas, tbwah, valid_bwa44); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[44], tbwbs, tbwbh, valid_bwb44); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[44], tbwbs, tbwbh, valid_bwb44); + $setuphold (posedge CLK &&& WEA, posedge DA[45], tdas, tdah, valid_da45); + $setuphold (posedge CLK &&& WEA, negedge DA[45], tdas, tdah, valid_da45); + $setuphold (posedge CLK &&& WEB, posedge DB[45], tdbs, tdbh, valid_db45); + $setuphold (posedge CLK &&& WEB, negedge DB[45], tdbs, tdbh, valid_db45); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[45], tbwas, tbwah, valid_bwa45); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[45], tbwas, tbwah, valid_bwa45); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[45], tbwbs, tbwbh, valid_bwb45); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[45], tbwbs, tbwbh, valid_bwb45); + $setuphold (posedge CLK &&& WEA, posedge DA[46], tdas, tdah, valid_da46); + $setuphold (posedge CLK &&& WEA, negedge DA[46], tdas, tdah, valid_da46); + $setuphold (posedge CLK &&& WEB, posedge DB[46], tdbs, tdbh, valid_db46); + $setuphold (posedge CLK &&& WEB, negedge DB[46], tdbs, tdbh, valid_db46); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[46], tbwas, tbwah, valid_bwa46); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[46], tbwas, tbwah, valid_bwa46); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[46], tbwbs, tbwbh, valid_bwb46); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[46], tbwbs, tbwbh, valid_bwb46); + $setuphold (posedge CLK &&& WEA, posedge DA[47], tdas, tdah, valid_da47); + $setuphold (posedge CLK &&& WEA, negedge DA[47], tdas, tdah, valid_da47); + $setuphold (posedge CLK &&& WEB, posedge DB[47], tdbs, tdbh, valid_db47); + $setuphold (posedge CLK &&& WEB, negedge DB[47], tdbs, tdbh, valid_db47); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[47], tbwas, tbwah, valid_bwa47); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[47], tbwas, tbwah, valid_bwa47); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[47], tbwbs, tbwbh, valid_bwb47); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[47], tbwbs, tbwbh, valid_bwb47); + $setuphold (posedge CLK &&& WEA, posedge DA[48], tdas, tdah, valid_da48); + $setuphold (posedge CLK &&& WEA, negedge DA[48], tdas, tdah, valid_da48); + $setuphold (posedge CLK &&& WEB, posedge DB[48], tdbs, tdbh, valid_db48); + $setuphold (posedge CLK &&& WEB, negedge DB[48], tdbs, tdbh, valid_db48); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[48], tbwas, tbwah, valid_bwa48); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[48], tbwas, tbwah, valid_bwa48); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[48], tbwbs, tbwbh, valid_bwb48); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[48], tbwbs, tbwbh, valid_bwb48); + $setuphold (posedge CLK &&& WEA, posedge DA[49], tdas, tdah, valid_da49); + $setuphold (posedge CLK &&& WEA, negedge DA[49], tdas, tdah, valid_da49); + $setuphold (posedge CLK &&& WEB, posedge DB[49], tdbs, tdbh, valid_db49); + $setuphold (posedge CLK &&& WEB, negedge DB[49], tdbs, tdbh, valid_db49); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[49], tbwas, tbwah, valid_bwa49); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[49], tbwas, tbwah, valid_bwa49); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[49], tbwbs, tbwbh, valid_bwb49); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[49], tbwbs, tbwbh, valid_bwb49); + $setuphold (posedge CLK &&& WEA, posedge DA[50], tdas, tdah, valid_da50); + $setuphold (posedge CLK &&& WEA, negedge DA[50], tdas, tdah, valid_da50); + $setuphold (posedge CLK &&& WEB, posedge DB[50], tdbs, tdbh, valid_db50); + $setuphold (posedge CLK &&& WEB, negedge DB[50], tdbs, tdbh, valid_db50); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[50], tbwas, tbwah, valid_bwa50); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[50], tbwas, tbwah, valid_bwa50); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[50], tbwbs, tbwbh, valid_bwb50); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[50], tbwbs, tbwbh, valid_bwb50); + $setuphold (posedge CLK &&& WEA, posedge DA[51], tdas, tdah, valid_da51); + $setuphold (posedge CLK &&& WEA, negedge DA[51], tdas, tdah, valid_da51); + $setuphold (posedge CLK &&& WEB, posedge DB[51], tdbs, tdbh, valid_db51); + $setuphold (posedge CLK &&& WEB, negedge DB[51], tdbs, tdbh, valid_db51); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[51], tbwas, tbwah, valid_bwa51); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[51], tbwas, tbwah, valid_bwa51); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[51], tbwbs, tbwbh, valid_bwb51); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[51], tbwbs, tbwbh, valid_bwb51); + $setuphold (posedge CLK &&& WEA, posedge DA[52], tdas, tdah, valid_da52); + $setuphold (posedge CLK &&& WEA, negedge DA[52], tdas, tdah, valid_da52); + $setuphold (posedge CLK &&& WEB, posedge DB[52], tdbs, tdbh, valid_db52); + $setuphold (posedge CLK &&& WEB, negedge DB[52], tdbs, tdbh, valid_db52); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[52], tbwas, tbwah, valid_bwa52); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[52], tbwas, tbwah, valid_bwa52); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[52], tbwbs, tbwbh, valid_bwb52); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[52], tbwbs, tbwbh, valid_bwb52); + $setuphold (posedge CLK &&& WEA, posedge DA[53], tdas, tdah, valid_da53); + $setuphold (posedge CLK &&& WEA, negedge DA[53], tdas, tdah, valid_da53); + $setuphold (posedge CLK &&& WEB, posedge DB[53], tdbs, tdbh, valid_db53); + $setuphold (posedge CLK &&& WEB, negedge DB[53], tdbs, tdbh, valid_db53); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[53], tbwas, tbwah, valid_bwa53); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[53], tbwas, tbwah, valid_bwa53); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[53], tbwbs, tbwbh, valid_bwb53); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[53], tbwbs, tbwbh, valid_bwb53); + $setuphold (posedge CLK &&& WEA, posedge DA[54], tdas, tdah, valid_da54); + $setuphold (posedge CLK &&& WEA, negedge DA[54], tdas, tdah, valid_da54); + $setuphold (posedge CLK &&& WEB, posedge DB[54], tdbs, tdbh, valid_db54); + $setuphold (posedge CLK &&& WEB, negedge DB[54], tdbs, tdbh, valid_db54); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[54], tbwas, tbwah, valid_bwa54); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[54], tbwas, tbwah, valid_bwa54); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[54], tbwbs, tbwbh, valid_bwb54); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[54], tbwbs, tbwbh, valid_bwb54); + $setuphold (posedge CLK &&& WEA, posedge DA[55], tdas, tdah, valid_da55); + $setuphold (posedge CLK &&& WEA, negedge DA[55], tdas, tdah, valid_da55); + $setuphold (posedge CLK &&& WEB, posedge DB[55], tdbs, tdbh, valid_db55); + $setuphold (posedge CLK &&& WEB, negedge DB[55], tdbs, tdbh, valid_db55); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[55], tbwas, tbwah, valid_bwa55); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[55], tbwas, tbwah, valid_bwa55); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[55], tbwbs, tbwbh, valid_bwb55); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[55], tbwbs, tbwbh, valid_bwb55); + $setuphold (posedge CLK &&& WEA, posedge DA[56], tdas, tdah, valid_da56); + $setuphold (posedge CLK &&& WEA, negedge DA[56], tdas, tdah, valid_da56); + $setuphold (posedge CLK &&& WEB, posedge DB[56], tdbs, tdbh, valid_db56); + $setuphold (posedge CLK &&& WEB, negedge DB[56], tdbs, tdbh, valid_db56); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[56], tbwas, tbwah, valid_bwa56); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[56], tbwas, tbwah, valid_bwa56); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[56], tbwbs, tbwbh, valid_bwb56); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[56], tbwbs, tbwbh, valid_bwb56); + $setuphold (posedge CLK &&& WEA, posedge DA[57], tdas, tdah, valid_da57); + $setuphold (posedge CLK &&& WEA, negedge DA[57], tdas, tdah, valid_da57); + $setuphold (posedge CLK &&& WEB, posedge DB[57], tdbs, tdbh, valid_db57); + $setuphold (posedge CLK &&& WEB, negedge DB[57], tdbs, tdbh, valid_db57); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[57], tbwas, tbwah, valid_bwa57); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[57], tbwas, tbwah, valid_bwa57); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[57], tbwbs, tbwbh, valid_bwb57); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[57], tbwbs, tbwbh, valid_bwb57); + $setuphold (posedge CLK &&& WEA, posedge DA[58], tdas, tdah, valid_da58); + $setuphold (posedge CLK &&& WEA, negedge DA[58], tdas, tdah, valid_da58); + $setuphold (posedge CLK &&& WEB, posedge DB[58], tdbs, tdbh, valid_db58); + $setuphold (posedge CLK &&& WEB, negedge DB[58], tdbs, tdbh, valid_db58); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[58], tbwas, tbwah, valid_bwa58); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[58], tbwas, tbwah, valid_bwa58); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[58], tbwbs, tbwbh, valid_bwb58); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[58], tbwbs, tbwbh, valid_bwb58); + $setuphold (posedge CLK &&& WEA, posedge DA[59], tdas, tdah, valid_da59); + $setuphold (posedge CLK &&& WEA, negedge DA[59], tdas, tdah, valid_da59); + $setuphold (posedge CLK &&& WEB, posedge DB[59], tdbs, tdbh, valid_db59); + $setuphold (posedge CLK &&& WEB, negedge DB[59], tdbs, tdbh, valid_db59); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[59], tbwas, tbwah, valid_bwa59); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[59], tbwas, tbwah, valid_bwa59); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[59], tbwbs, tbwbh, valid_bwb59); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[59], tbwbs, tbwbh, valid_bwb59); + $setuphold (posedge CLK &&& WEA, posedge DA[60], tdas, tdah, valid_da60); + $setuphold (posedge CLK &&& WEA, negedge DA[60], tdas, tdah, valid_da60); + $setuphold (posedge CLK &&& WEB, posedge DB[60], tdbs, tdbh, valid_db60); + $setuphold (posedge CLK &&& WEB, negedge DB[60], tdbs, tdbh, valid_db60); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[60], tbwas, tbwah, valid_bwa60); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[60], tbwas, tbwah, valid_bwa60); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[60], tbwbs, tbwbh, valid_bwb60); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[60], tbwbs, tbwbh, valid_bwb60); + $setuphold (posedge CLK &&& WEA, posedge DA[61], tdas, tdah, valid_da61); + $setuphold (posedge CLK &&& WEA, negedge DA[61], tdas, tdah, valid_da61); + $setuphold (posedge CLK &&& WEB, posedge DB[61], tdbs, tdbh, valid_db61); + $setuphold (posedge CLK &&& WEB, negedge DB[61], tdbs, tdbh, valid_db61); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[61], tbwas, tbwah, valid_bwa61); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[61], tbwas, tbwah, valid_bwa61); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[61], tbwbs, tbwbh, valid_bwb61); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[61], tbwbs, tbwbh, valid_bwb61); + $setuphold (posedge CLK &&& WEA, posedge DA[62], tdas, tdah, valid_da62); + $setuphold (posedge CLK &&& WEA, negedge DA[62], tdas, tdah, valid_da62); + $setuphold (posedge CLK &&& WEB, posedge DB[62], tdbs, tdbh, valid_db62); + $setuphold (posedge CLK &&& WEB, negedge DB[62], tdbs, tdbh, valid_db62); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[62], tbwas, tbwah, valid_bwa62); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[62], tbwas, tbwah, valid_bwa62); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[62], tbwbs, tbwbh, valid_bwb62); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[62], tbwbs, tbwbh, valid_bwb62); + $setuphold (posedge CLK &&& WEA, posedge DA[63], tdas, tdah, valid_da63); + $setuphold (posedge CLK &&& WEA, negedge DA[63], tdas, tdah, valid_da63); + $setuphold (posedge CLK &&& WEB, posedge DB[63], tdbs, tdbh, valid_db63); + $setuphold (posedge CLK &&& WEB, negedge DB[63], tdbs, tdbh, valid_db63); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[63], tbwas, tbwah, valid_bwa63); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[63], tbwas, tbwah, valid_bwa63); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[63], tbwbs, tbwbh, valid_bwb63); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[63], tbwbs, tbwbh, valid_bwb63); + $setuphold (posedge CLK &&& WEA, posedge DA[64], tdas, tdah, valid_da64); + $setuphold (posedge CLK &&& WEA, negedge DA[64], tdas, tdah, valid_da64); + $setuphold (posedge CLK &&& WEB, posedge DB[64], tdbs, tdbh, valid_db64); + $setuphold (posedge CLK &&& WEB, negedge DB[64], tdbs, tdbh, valid_db64); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[64], tbwas, tbwah, valid_bwa64); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[64], tbwas, tbwah, valid_bwa64); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[64], tbwbs, tbwbh, valid_bwb64); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[64], tbwbs, tbwbh, valid_bwb64); + $setuphold (posedge CLK &&& WEA, posedge DA[65], tdas, tdah, valid_da65); + $setuphold (posedge CLK &&& WEA, negedge DA[65], tdas, tdah, valid_da65); + $setuphold (posedge CLK &&& WEB, posedge DB[65], tdbs, tdbh, valid_db65); + $setuphold (posedge CLK &&& WEB, negedge DB[65], tdbs, tdbh, valid_db65); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[65], tbwas, tbwah, valid_bwa65); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[65], tbwas, tbwah, valid_bwa65); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[65], tbwbs, tbwbh, valid_bwb65); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[65], tbwbs, tbwbh, valid_bwb65); + $setuphold (posedge CLK &&& WEA, posedge DA[66], tdas, tdah, valid_da66); + $setuphold (posedge CLK &&& WEA, negedge DA[66], tdas, tdah, valid_da66); + $setuphold (posedge CLK &&& WEB, posedge DB[66], tdbs, tdbh, valid_db66); + $setuphold (posedge CLK &&& WEB, negedge DB[66], tdbs, tdbh, valid_db66); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[66], tbwas, tbwah, valid_bwa66); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[66], tbwas, tbwah, valid_bwa66); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[66], tbwbs, tbwbh, valid_bwb66); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[66], tbwbs, tbwbh, valid_bwb66); + $setuphold (posedge CLK &&& WEA, posedge DA[67], tdas, tdah, valid_da67); + $setuphold (posedge CLK &&& WEA, negedge DA[67], tdas, tdah, valid_da67); + $setuphold (posedge CLK &&& WEB, posedge DB[67], tdbs, tdbh, valid_db67); + $setuphold (posedge CLK &&& WEB, negedge DB[67], tdbs, tdbh, valid_db67); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[67], tbwas, tbwah, valid_bwa67); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[67], tbwas, tbwah, valid_bwa67); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[67], tbwbs, tbwbh, valid_bwb67); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[67], tbwbs, tbwbh, valid_bwb67); + $setuphold (posedge CLK &&& WEA, posedge DA[68], tdas, tdah, valid_da68); + $setuphold (posedge CLK &&& WEA, negedge DA[68], tdas, tdah, valid_da68); + $setuphold (posedge CLK &&& WEB, posedge DB[68], tdbs, tdbh, valid_db68); + $setuphold (posedge CLK &&& WEB, negedge DB[68], tdbs, tdbh, valid_db68); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[68], tbwas, tbwah, valid_bwa68); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[68], tbwas, tbwah, valid_bwa68); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[68], tbwbs, tbwbh, valid_bwb68); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[68], tbwbs, tbwbh, valid_bwb68); + $setuphold (posedge CLK &&& WEA, posedge DA[69], tdas, tdah, valid_da69); + $setuphold (posedge CLK &&& WEA, negedge DA[69], tdas, tdah, valid_da69); + $setuphold (posedge CLK &&& WEB, posedge DB[69], tdbs, tdbh, valid_db69); + $setuphold (posedge CLK &&& WEB, negedge DB[69], tdbs, tdbh, valid_db69); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[69], tbwas, tbwah, valid_bwa69); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[69], tbwas, tbwah, valid_bwa69); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[69], tbwbs, tbwbh, valid_bwb69); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[69], tbwbs, tbwbh, valid_bwb69); + $setuphold (posedge CLK &&& WEA, posedge DA[70], tdas, tdah, valid_da70); + $setuphold (posedge CLK &&& WEA, negedge DA[70], tdas, tdah, valid_da70); + $setuphold (posedge CLK &&& WEB, posedge DB[70], tdbs, tdbh, valid_db70); + $setuphold (posedge CLK &&& WEB, negedge DB[70], tdbs, tdbh, valid_db70); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[70], tbwas, tbwah, valid_bwa70); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[70], tbwas, tbwah, valid_bwa70); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[70], tbwbs, tbwbh, valid_bwb70); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[70], tbwbs, tbwbh, valid_bwb70); + $setuphold (posedge CLK &&& WEA, posedge DA[71], tdas, tdah, valid_da71); + $setuphold (posedge CLK &&& WEA, negedge DA[71], tdas, tdah, valid_da71); + $setuphold (posedge CLK &&& WEB, posedge DB[71], tdbs, tdbh, valid_db71); + $setuphold (posedge CLK &&& WEB, negedge DB[71], tdbs, tdbh, valid_db71); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[71], tbwas, tbwah, valid_bwa71); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[71], tbwas, tbwah, valid_bwa71); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[71], tbwbs, tbwbh, valid_bwb71); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[71], tbwbs, tbwbh, valid_bwb71); + $setuphold (posedge CLK &&& WEA, posedge DA[72], tdas, tdah, valid_da72); + $setuphold (posedge CLK &&& WEA, negedge DA[72], tdas, tdah, valid_da72); + $setuphold (posedge CLK &&& WEB, posedge DB[72], tdbs, tdbh, valid_db72); + $setuphold (posedge CLK &&& WEB, negedge DB[72], tdbs, tdbh, valid_db72); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[72], tbwas, tbwah, valid_bwa72); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[72], tbwas, tbwah, valid_bwa72); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[72], tbwbs, tbwbh, valid_bwb72); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[72], tbwbs, tbwbh, valid_bwb72); + $setuphold (posedge CLK &&& WEA, posedge DA[73], tdas, tdah, valid_da73); + $setuphold (posedge CLK &&& WEA, negedge DA[73], tdas, tdah, valid_da73); + $setuphold (posedge CLK &&& WEB, posedge DB[73], tdbs, tdbh, valid_db73); + $setuphold (posedge CLK &&& WEB, negedge DB[73], tdbs, tdbh, valid_db73); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[73], tbwas, tbwah, valid_bwa73); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[73], tbwas, tbwah, valid_bwa73); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[73], tbwbs, tbwbh, valid_bwb73); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[73], tbwbs, tbwbh, valid_bwb73); + $setuphold (posedge CLK &&& WEA, posedge DA[74], tdas, tdah, valid_da74); + $setuphold (posedge CLK &&& WEA, negedge DA[74], tdas, tdah, valid_da74); + $setuphold (posedge CLK &&& WEB, posedge DB[74], tdbs, tdbh, valid_db74); + $setuphold (posedge CLK &&& WEB, negedge DB[74], tdbs, tdbh, valid_db74); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[74], tbwas, tbwah, valid_bwa74); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[74], tbwas, tbwah, valid_bwa74); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[74], tbwbs, tbwbh, valid_bwb74); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[74], tbwbs, tbwbh, valid_bwb74); + $setuphold (posedge CLK &&& WEA, posedge DA[75], tdas, tdah, valid_da75); + $setuphold (posedge CLK &&& WEA, negedge DA[75], tdas, tdah, valid_da75); + $setuphold (posedge CLK &&& WEB, posedge DB[75], tdbs, tdbh, valid_db75); + $setuphold (posedge CLK &&& WEB, negedge DB[75], tdbs, tdbh, valid_db75); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[75], tbwas, tbwah, valid_bwa75); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[75], tbwas, tbwah, valid_bwa75); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[75], tbwbs, tbwbh, valid_bwb75); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[75], tbwbs, tbwbh, valid_bwb75); + $setuphold (posedge CLK &&& WEA, posedge DA[76], tdas, tdah, valid_da76); + $setuphold (posedge CLK &&& WEA, negedge DA[76], tdas, tdah, valid_da76); + $setuphold (posedge CLK &&& WEB, posedge DB[76], tdbs, tdbh, valid_db76); + $setuphold (posedge CLK &&& WEB, negedge DB[76], tdbs, tdbh, valid_db76); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[76], tbwas, tbwah, valid_bwa76); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[76], tbwas, tbwah, valid_bwa76); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[76], tbwbs, tbwbh, valid_bwb76); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[76], tbwbs, tbwbh, valid_bwb76); + $setuphold (posedge CLK &&& WEA, posedge DA[77], tdas, tdah, valid_da77); + $setuphold (posedge CLK &&& WEA, negedge DA[77], tdas, tdah, valid_da77); + $setuphold (posedge CLK &&& WEB, posedge DB[77], tdbs, tdbh, valid_db77); + $setuphold (posedge CLK &&& WEB, negedge DB[77], tdbs, tdbh, valid_db77); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[77], tbwas, tbwah, valid_bwa77); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[77], tbwas, tbwah, valid_bwa77); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[77], tbwbs, tbwbh, valid_bwb77); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[77], tbwbs, tbwbh, valid_bwb77); + $setuphold (posedge CLK &&& WEA, posedge DA[78], tdas, tdah, valid_da78); + $setuphold (posedge CLK &&& WEA, negedge DA[78], tdas, tdah, valid_da78); + $setuphold (posedge CLK &&& WEB, posedge DB[78], tdbs, tdbh, valid_db78); + $setuphold (posedge CLK &&& WEB, negedge DB[78], tdbs, tdbh, valid_db78); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[78], tbwas, tbwah, valid_bwa78); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[78], tbwas, tbwah, valid_bwa78); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[78], tbwbs, tbwbh, valid_bwb78); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[78], tbwbs, tbwbh, valid_bwb78); + $setuphold (posedge CLK &&& WEA, posedge DA[79], tdas, tdah, valid_da79); + $setuphold (posedge CLK &&& WEA, negedge DA[79], tdas, tdah, valid_da79); + $setuphold (posedge CLK &&& WEB, posedge DB[79], tdbs, tdbh, valid_db79); + $setuphold (posedge CLK &&& WEB, negedge DB[79], tdbs, tdbh, valid_db79); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[79], tbwas, tbwah, valid_bwa79); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[79], tbwas, tbwah, valid_bwa79); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[79], tbwbs, tbwbh, valid_bwb79); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[79], tbwbs, tbwbh, valid_bwb79); + $setuphold (posedge CLK &&& WEA, posedge DA[80], tdas, tdah, valid_da80); + $setuphold (posedge CLK &&& WEA, negedge DA[80], tdas, tdah, valid_da80); + $setuphold (posedge CLK &&& WEB, posedge DB[80], tdbs, tdbh, valid_db80); + $setuphold (posedge CLK &&& WEB, negedge DB[80], tdbs, tdbh, valid_db80); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[80], tbwas, tbwah, valid_bwa80); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[80], tbwas, tbwah, valid_bwa80); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[80], tbwbs, tbwbh, valid_bwb80); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[80], tbwbs, tbwbh, valid_bwb80); + $setuphold (posedge CLK &&& WEA, posedge DA[81], tdas, tdah, valid_da81); + $setuphold (posedge CLK &&& WEA, negedge DA[81], tdas, tdah, valid_da81); + $setuphold (posedge CLK &&& WEB, posedge DB[81], tdbs, tdbh, valid_db81); + $setuphold (posedge CLK &&& WEB, negedge DB[81], tdbs, tdbh, valid_db81); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[81], tbwas, tbwah, valid_bwa81); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[81], tbwas, tbwah, valid_bwa81); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[81], tbwbs, tbwbh, valid_bwb81); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[81], tbwbs, tbwbh, valid_bwb81); + $setuphold (posedge CLK &&& WEA, posedge DA[82], tdas, tdah, valid_da82); + $setuphold (posedge CLK &&& WEA, negedge DA[82], tdas, tdah, valid_da82); + $setuphold (posedge CLK &&& WEB, posedge DB[82], tdbs, tdbh, valid_db82); + $setuphold (posedge CLK &&& WEB, negedge DB[82], tdbs, tdbh, valid_db82); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[82], tbwas, tbwah, valid_bwa82); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[82], tbwas, tbwah, valid_bwa82); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[82], tbwbs, tbwbh, valid_bwb82); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[82], tbwbs, tbwbh, valid_bwb82); + $setuphold (posedge CLK &&& WEA, posedge DA[83], tdas, tdah, valid_da83); + $setuphold (posedge CLK &&& WEA, negedge DA[83], tdas, tdah, valid_da83); + $setuphold (posedge CLK &&& WEB, posedge DB[83], tdbs, tdbh, valid_db83); + $setuphold (posedge CLK &&& WEB, negedge DB[83], tdbs, tdbh, valid_db83); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[83], tbwas, tbwah, valid_bwa83); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[83], tbwas, tbwah, valid_bwa83); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[83], tbwbs, tbwbh, valid_bwb83); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[83], tbwbs, tbwbh, valid_bwb83); + $setuphold (posedge CLK &&& WEA, posedge DA[84], tdas, tdah, valid_da84); + $setuphold (posedge CLK &&& WEA, negedge DA[84], tdas, tdah, valid_da84); + $setuphold (posedge CLK &&& WEB, posedge DB[84], tdbs, tdbh, valid_db84); + $setuphold (posedge CLK &&& WEB, negedge DB[84], tdbs, tdbh, valid_db84); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[84], tbwas, tbwah, valid_bwa84); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[84], tbwas, tbwah, valid_bwa84); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[84], tbwbs, tbwbh, valid_bwb84); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[84], tbwbs, tbwbh, valid_bwb84); + $setuphold (posedge CLK &&& WEA, posedge DA[85], tdas, tdah, valid_da85); + $setuphold (posedge CLK &&& WEA, negedge DA[85], tdas, tdah, valid_da85); + $setuphold (posedge CLK &&& WEB, posedge DB[85], tdbs, tdbh, valid_db85); + $setuphold (posedge CLK &&& WEB, negedge DB[85], tdbs, tdbh, valid_db85); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[85], tbwas, tbwah, valid_bwa85); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[85], tbwas, tbwah, valid_bwa85); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[85], tbwbs, tbwbh, valid_bwb85); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[85], tbwbs, tbwbh, valid_bwb85); + $setuphold (posedge CLK &&& WEA, posedge DA[86], tdas, tdah, valid_da86); + $setuphold (posedge CLK &&& WEA, negedge DA[86], tdas, tdah, valid_da86); + $setuphold (posedge CLK &&& WEB, posedge DB[86], tdbs, tdbh, valid_db86); + $setuphold (posedge CLK &&& WEB, negedge DB[86], tdbs, tdbh, valid_db86); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[86], tbwas, tbwah, valid_bwa86); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[86], tbwas, tbwah, valid_bwa86); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[86], tbwbs, tbwbh, valid_bwb86); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[86], tbwbs, tbwbh, valid_bwb86); + $setuphold (posedge CLK &&& WEA, posedge DA[87], tdas, tdah, valid_da87); + $setuphold (posedge CLK &&& WEA, negedge DA[87], tdas, tdah, valid_da87); + $setuphold (posedge CLK &&& WEB, posedge DB[87], tdbs, tdbh, valid_db87); + $setuphold (posedge CLK &&& WEB, negedge DB[87], tdbs, tdbh, valid_db87); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[87], tbwas, tbwah, valid_bwa87); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[87], tbwas, tbwah, valid_bwa87); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[87], tbwbs, tbwbh, valid_bwb87); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[87], tbwbs, tbwbh, valid_bwb87); + $setuphold (posedge CLK &&& WEA, posedge DA[88], tdas, tdah, valid_da88); + $setuphold (posedge CLK &&& WEA, negedge DA[88], tdas, tdah, valid_da88); + $setuphold (posedge CLK &&& WEB, posedge DB[88], tdbs, tdbh, valid_db88); + $setuphold (posedge CLK &&& WEB, negedge DB[88], tdbs, tdbh, valid_db88); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[88], tbwas, tbwah, valid_bwa88); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[88], tbwas, tbwah, valid_bwa88); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[88], tbwbs, tbwbh, valid_bwb88); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[88], tbwbs, tbwbh, valid_bwb88); + $setuphold (posedge CLK &&& WEA, posedge DA[89], tdas, tdah, valid_da89); + $setuphold (posedge CLK &&& WEA, negedge DA[89], tdas, tdah, valid_da89); + $setuphold (posedge CLK &&& WEB, posedge DB[89], tdbs, tdbh, valid_db89); + $setuphold (posedge CLK &&& WEB, negedge DB[89], tdbs, tdbh, valid_db89); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[89], tbwas, tbwah, valid_bwa89); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[89], tbwas, tbwah, valid_bwa89); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[89], tbwbs, tbwbh, valid_bwb89); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[89], tbwbs, tbwbh, valid_bwb89); + $setuphold (posedge CLK &&& WEA, posedge DA[90], tdas, tdah, valid_da90); + $setuphold (posedge CLK &&& WEA, negedge DA[90], tdas, tdah, valid_da90); + $setuphold (posedge CLK &&& WEB, posedge DB[90], tdbs, tdbh, valid_db90); + $setuphold (posedge CLK &&& WEB, negedge DB[90], tdbs, tdbh, valid_db90); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[90], tbwas, tbwah, valid_bwa90); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[90], tbwas, tbwah, valid_bwa90); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[90], tbwbs, tbwbh, valid_bwb90); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[90], tbwbs, tbwbh, valid_bwb90); + $setuphold (posedge CLK &&& WEA, posedge DA[91], tdas, tdah, valid_da91); + $setuphold (posedge CLK &&& WEA, negedge DA[91], tdas, tdah, valid_da91); + $setuphold (posedge CLK &&& WEB, posedge DB[91], tdbs, tdbh, valid_db91); + $setuphold (posedge CLK &&& WEB, negedge DB[91], tdbs, tdbh, valid_db91); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[91], tbwas, tbwah, valid_bwa91); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[91], tbwas, tbwah, valid_bwa91); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[91], tbwbs, tbwbh, valid_bwb91); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[91], tbwbs, tbwbh, valid_bwb91); + $setuphold (posedge CLK &&& WEA, posedge DA[92], tdas, tdah, valid_da92); + $setuphold (posedge CLK &&& WEA, negedge DA[92], tdas, tdah, valid_da92); + $setuphold (posedge CLK &&& WEB, posedge DB[92], tdbs, tdbh, valid_db92); + $setuphold (posedge CLK &&& WEB, negedge DB[92], tdbs, tdbh, valid_db92); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[92], tbwas, tbwah, valid_bwa92); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[92], tbwas, tbwah, valid_bwa92); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[92], tbwbs, tbwbh, valid_bwb92); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[92], tbwbs, tbwbh, valid_bwb92); + $setuphold (posedge CLK &&& WEA, posedge DA[93], tdas, tdah, valid_da93); + $setuphold (posedge CLK &&& WEA, negedge DA[93], tdas, tdah, valid_da93); + $setuphold (posedge CLK &&& WEB, posedge DB[93], tdbs, tdbh, valid_db93); + $setuphold (posedge CLK &&& WEB, negedge DB[93], tdbs, tdbh, valid_db93); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[93], tbwas, tbwah, valid_bwa93); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[93], tbwas, tbwah, valid_bwa93); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[93], tbwbs, tbwbh, valid_bwb93); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[93], tbwbs, tbwbh, valid_bwb93); + $setuphold (posedge CLK &&& WEA, posedge DA[94], tdas, tdah, valid_da94); + $setuphold (posedge CLK &&& WEA, negedge DA[94], tdas, tdah, valid_da94); + $setuphold (posedge CLK &&& WEB, posedge DB[94], tdbs, tdbh, valid_db94); + $setuphold (posedge CLK &&& WEB, negedge DB[94], tdbs, tdbh, valid_db94); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[94], tbwas, tbwah, valid_bwa94); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[94], tbwas, tbwah, valid_bwa94); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[94], tbwbs, tbwbh, valid_bwb94); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[94], tbwbs, tbwbh, valid_bwb94); + $setuphold (posedge CLK &&& WEA, posedge DA[95], tdas, tdah, valid_da95); + $setuphold (posedge CLK &&& WEA, negedge DA[95], tdas, tdah, valid_da95); + $setuphold (posedge CLK &&& WEB, posedge DB[95], tdbs, tdbh, valid_db95); + $setuphold (posedge CLK &&& WEB, negedge DB[95], tdbs, tdbh, valid_db95); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[95], tbwas, tbwah, valid_bwa95); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[95], tbwas, tbwah, valid_bwa95); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[95], tbwbs, tbwbh, valid_bwb95); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[95], tbwbs, tbwbh, valid_bwb95); + $setuphold (posedge CLK &&& WEA, posedge DA[96], tdas, tdah, valid_da96); + $setuphold (posedge CLK &&& WEA, negedge DA[96], tdas, tdah, valid_da96); + $setuphold (posedge CLK &&& WEB, posedge DB[96], tdbs, tdbh, valid_db96); + $setuphold (posedge CLK &&& WEB, negedge DB[96], tdbs, tdbh, valid_db96); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[96], tbwas, tbwah, valid_bwa96); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[96], tbwas, tbwah, valid_bwa96); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[96], tbwbs, tbwbh, valid_bwb96); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[96], tbwbs, tbwbh, valid_bwb96); + $setuphold (posedge CLK &&& WEA, posedge DA[97], tdas, tdah, valid_da97); + $setuphold (posedge CLK &&& WEA, negedge DA[97], tdas, tdah, valid_da97); + $setuphold (posedge CLK &&& WEB, posedge DB[97], tdbs, tdbh, valid_db97); + $setuphold (posedge CLK &&& WEB, negedge DB[97], tdbs, tdbh, valid_db97); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[97], tbwas, tbwah, valid_bwa97); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[97], tbwas, tbwah, valid_bwa97); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[97], tbwbs, tbwbh, valid_bwb97); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[97], tbwbs, tbwbh, valid_bwb97); + $setuphold (posedge CLK &&& WEA, posedge DA[98], tdas, tdah, valid_da98); + $setuphold (posedge CLK &&& WEA, negedge DA[98], tdas, tdah, valid_da98); + $setuphold (posedge CLK &&& WEB, posedge DB[98], tdbs, tdbh, valid_db98); + $setuphold (posedge CLK &&& WEB, negedge DB[98], tdbs, tdbh, valid_db98); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[98], tbwas, tbwah, valid_bwa98); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[98], tbwas, tbwah, valid_bwa98); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[98], tbwbs, tbwbh, valid_bwb98); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[98], tbwbs, tbwbh, valid_bwb98); + $setuphold (posedge CLK &&& WEA, posedge DA[99], tdas, tdah, valid_da99); + $setuphold (posedge CLK &&& WEA, negedge DA[99], tdas, tdah, valid_da99); + $setuphold (posedge CLK &&& WEB, posedge DB[99], tdbs, tdbh, valid_db99); + $setuphold (posedge CLK &&& WEB, negedge DB[99], tdbs, tdbh, valid_db99); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[99], tbwas, tbwah, valid_bwa99); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[99], tbwas, tbwah, valid_bwa99); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[99], tbwbs, tbwbh, valid_bwb99); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[99], tbwbs, tbwbh, valid_bwb99); + $setuphold (posedge CLK &&& WEA, posedge DA[100], tdas, tdah, valid_da100); + $setuphold (posedge CLK &&& WEA, negedge DA[100], tdas, tdah, valid_da100); + $setuphold (posedge CLK &&& WEB, posedge DB[100], tdbs, tdbh, valid_db100); + $setuphold (posedge CLK &&& WEB, negedge DB[100], tdbs, tdbh, valid_db100); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[100], tbwas, tbwah, valid_bwa100); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[100], tbwas, tbwah, valid_bwa100); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[100], tbwbs, tbwbh, valid_bwb100); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[100], tbwbs, tbwbh, valid_bwb100); + $setuphold (posedge CLK &&& WEA, posedge DA[101], tdas, tdah, valid_da101); + $setuphold (posedge CLK &&& WEA, negedge DA[101], tdas, tdah, valid_da101); + $setuphold (posedge CLK &&& WEB, posedge DB[101], tdbs, tdbh, valid_db101); + $setuphold (posedge CLK &&& WEB, negedge DB[101], tdbs, tdbh, valid_db101); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[101], tbwas, tbwah, valid_bwa101); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[101], tbwas, tbwah, valid_bwa101); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[101], tbwbs, tbwbh, valid_bwb101); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[101], tbwbs, tbwbh, valid_bwb101); + $setuphold (posedge CLK &&& WEA, posedge DA[102], tdas, tdah, valid_da102); + $setuphold (posedge CLK &&& WEA, negedge DA[102], tdas, tdah, valid_da102); + $setuphold (posedge CLK &&& WEB, posedge DB[102], tdbs, tdbh, valid_db102); + $setuphold (posedge CLK &&& WEB, negedge DB[102], tdbs, tdbh, valid_db102); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[102], tbwas, tbwah, valid_bwa102); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[102], tbwas, tbwah, valid_bwa102); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[102], tbwbs, tbwbh, valid_bwb102); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[102], tbwbs, tbwbh, valid_bwb102); + $setuphold (posedge CLK &&& WEA, posedge DA[103], tdas, tdah, valid_da103); + $setuphold (posedge CLK &&& WEA, negedge DA[103], tdas, tdah, valid_da103); + $setuphold (posedge CLK &&& WEB, posedge DB[103], tdbs, tdbh, valid_db103); + $setuphold (posedge CLK &&& WEB, negedge DB[103], tdbs, tdbh, valid_db103); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[103], tbwas, tbwah, valid_bwa103); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[103], tbwas, tbwah, valid_bwa103); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[103], tbwbs, tbwbh, valid_bwb103); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[103], tbwbs, tbwbh, valid_bwb103); + $setuphold (posedge CLK &&& WEA, posedge DA[104], tdas, tdah, valid_da104); + $setuphold (posedge CLK &&& WEA, negedge DA[104], tdas, tdah, valid_da104); + $setuphold (posedge CLK &&& WEB, posedge DB[104], tdbs, tdbh, valid_db104); + $setuphold (posedge CLK &&& WEB, negedge DB[104], tdbs, tdbh, valid_db104); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[104], tbwas, tbwah, valid_bwa104); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[104], tbwas, tbwah, valid_bwa104); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[104], tbwbs, tbwbh, valid_bwb104); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[104], tbwbs, tbwbh, valid_bwb104); + $setuphold (posedge CLK &&& WEA, posedge DA[105], tdas, tdah, valid_da105); + $setuphold (posedge CLK &&& WEA, negedge DA[105], tdas, tdah, valid_da105); + $setuphold (posedge CLK &&& WEB, posedge DB[105], tdbs, tdbh, valid_db105); + $setuphold (posedge CLK &&& WEB, negedge DB[105], tdbs, tdbh, valid_db105); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[105], tbwas, tbwah, valid_bwa105); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[105], tbwas, tbwah, valid_bwa105); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[105], tbwbs, tbwbh, valid_bwb105); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[105], tbwbs, tbwbh, valid_bwb105); + $setuphold (posedge CLK &&& WEA, posedge DA[106], tdas, tdah, valid_da106); + $setuphold (posedge CLK &&& WEA, negedge DA[106], tdas, tdah, valid_da106); + $setuphold (posedge CLK &&& WEB, posedge DB[106], tdbs, tdbh, valid_db106); + $setuphold (posedge CLK &&& WEB, negedge DB[106], tdbs, tdbh, valid_db106); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[106], tbwas, tbwah, valid_bwa106); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[106], tbwas, tbwah, valid_bwa106); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[106], tbwbs, tbwbh, valid_bwb106); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[106], tbwbs, tbwbh, valid_bwb106); + $setuphold (posedge CLK &&& WEA, posedge DA[107], tdas, tdah, valid_da107); + $setuphold (posedge CLK &&& WEA, negedge DA[107], tdas, tdah, valid_da107); + $setuphold (posedge CLK &&& WEB, posedge DB[107], tdbs, tdbh, valid_db107); + $setuphold (posedge CLK &&& WEB, negedge DB[107], tdbs, tdbh, valid_db107); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[107], tbwas, tbwah, valid_bwa107); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[107], tbwas, tbwah, valid_bwa107); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[107], tbwbs, tbwbh, valid_bwb107); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[107], tbwbs, tbwbh, valid_bwb107); + $setuphold (posedge CLK &&& WEA, posedge DA[108], tdas, tdah, valid_da108); + $setuphold (posedge CLK &&& WEA, negedge DA[108], tdas, tdah, valid_da108); + $setuphold (posedge CLK &&& WEB, posedge DB[108], tdbs, tdbh, valid_db108); + $setuphold (posedge CLK &&& WEB, negedge DB[108], tdbs, tdbh, valid_db108); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[108], tbwas, tbwah, valid_bwa108); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[108], tbwas, tbwah, valid_bwa108); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[108], tbwbs, tbwbh, valid_bwb108); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[108], tbwbs, tbwbh, valid_bwb108); + $setuphold (posedge CLK &&& WEA, posedge DA[109], tdas, tdah, valid_da109); + $setuphold (posedge CLK &&& WEA, negedge DA[109], tdas, tdah, valid_da109); + $setuphold (posedge CLK &&& WEB, posedge DB[109], tdbs, tdbh, valid_db109); + $setuphold (posedge CLK &&& WEB, negedge DB[109], tdbs, tdbh, valid_db109); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[109], tbwas, tbwah, valid_bwa109); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[109], tbwas, tbwah, valid_bwa109); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[109], tbwbs, tbwbh, valid_bwb109); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[109], tbwbs, tbwbh, valid_bwb109); + $setuphold (posedge CLK &&& WEA, posedge DA[110], tdas, tdah, valid_da110); + $setuphold (posedge CLK &&& WEA, negedge DA[110], tdas, tdah, valid_da110); + $setuphold (posedge CLK &&& WEB, posedge DB[110], tdbs, tdbh, valid_db110); + $setuphold (posedge CLK &&& WEB, negedge DB[110], tdbs, tdbh, valid_db110); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[110], tbwas, tbwah, valid_bwa110); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[110], tbwas, tbwah, valid_bwa110); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[110], tbwbs, tbwbh, valid_bwb110); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[110], tbwbs, tbwbh, valid_bwb110); + $setuphold (posedge CLK &&& WEA, posedge DA[111], tdas, tdah, valid_da111); + $setuphold (posedge CLK &&& WEA, negedge DA[111], tdas, tdah, valid_da111); + $setuphold (posedge CLK &&& WEB, posedge DB[111], tdbs, tdbh, valid_db111); + $setuphold (posedge CLK &&& WEB, negedge DB[111], tdbs, tdbh, valid_db111); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[111], tbwas, tbwah, valid_bwa111); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[111], tbwas, tbwah, valid_bwa111); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[111], tbwbs, tbwbh, valid_bwb111); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[111], tbwbs, tbwbh, valid_bwb111); + $setuphold (posedge CLK &&& WEA, posedge DA[112], tdas, tdah, valid_da112); + $setuphold (posedge CLK &&& WEA, negedge DA[112], tdas, tdah, valid_da112); + $setuphold (posedge CLK &&& WEB, posedge DB[112], tdbs, tdbh, valid_db112); + $setuphold (posedge CLK &&& WEB, negedge DB[112], tdbs, tdbh, valid_db112); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[112], tbwas, tbwah, valid_bwa112); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[112], tbwas, tbwah, valid_bwa112); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[112], tbwbs, tbwbh, valid_bwb112); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[112], tbwbs, tbwbh, valid_bwb112); + $setuphold (posedge CLK &&& WEA, posedge DA[113], tdas, tdah, valid_da113); + $setuphold (posedge CLK &&& WEA, negedge DA[113], tdas, tdah, valid_da113); + $setuphold (posedge CLK &&& WEB, posedge DB[113], tdbs, tdbh, valid_db113); + $setuphold (posedge CLK &&& WEB, negedge DB[113], tdbs, tdbh, valid_db113); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[113], tbwas, tbwah, valid_bwa113); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[113], tbwas, tbwah, valid_bwa113); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[113], tbwbs, tbwbh, valid_bwb113); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[113], tbwbs, tbwbh, valid_bwb113); + $setuphold (posedge CLK &&& WEA, posedge DA[114], tdas, tdah, valid_da114); + $setuphold (posedge CLK &&& WEA, negedge DA[114], tdas, tdah, valid_da114); + $setuphold (posedge CLK &&& WEB, posedge DB[114], tdbs, tdbh, valid_db114); + $setuphold (posedge CLK &&& WEB, negedge DB[114], tdbs, tdbh, valid_db114); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[114], tbwas, tbwah, valid_bwa114); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[114], tbwas, tbwah, valid_bwa114); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[114], tbwbs, tbwbh, valid_bwb114); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[114], tbwbs, tbwbh, valid_bwb114); + $setuphold (posedge CLK &&& WEA, posedge DA[115], tdas, tdah, valid_da115); + $setuphold (posedge CLK &&& WEA, negedge DA[115], tdas, tdah, valid_da115); + $setuphold (posedge CLK &&& WEB, posedge DB[115], tdbs, tdbh, valid_db115); + $setuphold (posedge CLK &&& WEB, negedge DB[115], tdbs, tdbh, valid_db115); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[115], tbwas, tbwah, valid_bwa115); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[115], tbwas, tbwah, valid_bwa115); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[115], tbwbs, tbwbh, valid_bwb115); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[115], tbwbs, tbwbh, valid_bwb115); + $setuphold (posedge CLK &&& WEA, posedge DA[116], tdas, tdah, valid_da116); + $setuphold (posedge CLK &&& WEA, negedge DA[116], tdas, tdah, valid_da116); + $setuphold (posedge CLK &&& WEB, posedge DB[116], tdbs, tdbh, valid_db116); + $setuphold (posedge CLK &&& WEB, negedge DB[116], tdbs, tdbh, valid_db116); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[116], tbwas, tbwah, valid_bwa116); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[116], tbwas, tbwah, valid_bwa116); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[116], tbwbs, tbwbh, valid_bwb116); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[116], tbwbs, tbwbh, valid_bwb116); + $setuphold (posedge CLK &&& WEA, posedge DA[117], tdas, tdah, valid_da117); + $setuphold (posedge CLK &&& WEA, negedge DA[117], tdas, tdah, valid_da117); + $setuphold (posedge CLK &&& WEB, posedge DB[117], tdbs, tdbh, valid_db117); + $setuphold (posedge CLK &&& WEB, negedge DB[117], tdbs, tdbh, valid_db117); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[117], tbwas, tbwah, valid_bwa117); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[117], tbwas, tbwah, valid_bwa117); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[117], tbwbs, tbwbh, valid_bwb117); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[117], tbwbs, tbwbh, valid_bwb117); + $setuphold (posedge CLK &&& WEA, posedge DA[118], tdas, tdah, valid_da118); + $setuphold (posedge CLK &&& WEA, negedge DA[118], tdas, tdah, valid_da118); + $setuphold (posedge CLK &&& WEB, posedge DB[118], tdbs, tdbh, valid_db118); + $setuphold (posedge CLK &&& WEB, negedge DB[118], tdbs, tdbh, valid_db118); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[118], tbwas, tbwah, valid_bwa118); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[118], tbwas, tbwah, valid_bwa118); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[118], tbwbs, tbwbh, valid_bwb118); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[118], tbwbs, tbwbh, valid_bwb118); + $setuphold (posedge CLK &&& WEA, posedge DA[119], tdas, tdah, valid_da119); + $setuphold (posedge CLK &&& WEA, negedge DA[119], tdas, tdah, valid_da119); + $setuphold (posedge CLK &&& WEB, posedge DB[119], tdbs, tdbh, valid_db119); + $setuphold (posedge CLK &&& WEB, negedge DB[119], tdbs, tdbh, valid_db119); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[119], tbwas, tbwah, valid_bwa119); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[119], tbwas, tbwah, valid_bwa119); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[119], tbwbs, tbwbh, valid_bwb119); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[119], tbwbs, tbwbh, valid_bwb119); + $setuphold (posedge CLK &&& WEA, posedge DA[120], tdas, tdah, valid_da120); + $setuphold (posedge CLK &&& WEA, negedge DA[120], tdas, tdah, valid_da120); + $setuphold (posedge CLK &&& WEB, posedge DB[120], tdbs, tdbh, valid_db120); + $setuphold (posedge CLK &&& WEB, negedge DB[120], tdbs, tdbh, valid_db120); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[120], tbwas, tbwah, valid_bwa120); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[120], tbwas, tbwah, valid_bwa120); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[120], tbwbs, tbwbh, valid_bwb120); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[120], tbwbs, tbwbh, valid_bwb120); + $setuphold (posedge CLK &&& WEA, posedge DA[121], tdas, tdah, valid_da121); + $setuphold (posedge CLK &&& WEA, negedge DA[121], tdas, tdah, valid_da121); + $setuphold (posedge CLK &&& WEB, posedge DB[121], tdbs, tdbh, valid_db121); + $setuphold (posedge CLK &&& WEB, negedge DB[121], tdbs, tdbh, valid_db121); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[121], tbwas, tbwah, valid_bwa121); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[121], tbwas, tbwah, valid_bwa121); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[121], tbwbs, tbwbh, valid_bwb121); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[121], tbwbs, tbwbh, valid_bwb121); + $setuphold (posedge CLK &&& WEA, posedge DA[122], tdas, tdah, valid_da122); + $setuphold (posedge CLK &&& WEA, negedge DA[122], tdas, tdah, valid_da122); + $setuphold (posedge CLK &&& WEB, posedge DB[122], tdbs, tdbh, valid_db122); + $setuphold (posedge CLK &&& WEB, negedge DB[122], tdbs, tdbh, valid_db122); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[122], tbwas, tbwah, valid_bwa122); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[122], tbwas, tbwah, valid_bwa122); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[122], tbwbs, tbwbh, valid_bwb122); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[122], tbwbs, tbwbh, valid_bwb122); + $setuphold (posedge CLK &&& WEA, posedge DA[123], tdas, tdah, valid_da123); + $setuphold (posedge CLK &&& WEA, negedge DA[123], tdas, tdah, valid_da123); + $setuphold (posedge CLK &&& WEB, posedge DB[123], tdbs, tdbh, valid_db123); + $setuphold (posedge CLK &&& WEB, negedge DB[123], tdbs, tdbh, valid_db123); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[123], tbwas, tbwah, valid_bwa123); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[123], tbwas, tbwah, valid_bwa123); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[123], tbwbs, tbwbh, valid_bwb123); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[123], tbwbs, tbwbh, valid_bwb123); + $setuphold (posedge CLK &&& WEA, posedge DA[124], tdas, tdah, valid_da124); + $setuphold (posedge CLK &&& WEA, negedge DA[124], tdas, tdah, valid_da124); + $setuphold (posedge CLK &&& WEB, posedge DB[124], tdbs, tdbh, valid_db124); + $setuphold (posedge CLK &&& WEB, negedge DB[124], tdbs, tdbh, valid_db124); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[124], tbwas, tbwah, valid_bwa124); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[124], tbwas, tbwah, valid_bwa124); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[124], tbwbs, tbwbh, valid_bwb124); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[124], tbwbs, tbwbh, valid_bwb124); + $setuphold (posedge CLK &&& WEA, posedge DA[125], tdas, tdah, valid_da125); + $setuphold (posedge CLK &&& WEA, negedge DA[125], tdas, tdah, valid_da125); + $setuphold (posedge CLK &&& WEB, posedge DB[125], tdbs, tdbh, valid_db125); + $setuphold (posedge CLK &&& WEB, negedge DB[125], tdbs, tdbh, valid_db125); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[125], tbwas, tbwah, valid_bwa125); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[125], tbwas, tbwah, valid_bwa125); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[125], tbwbs, tbwbh, valid_bwb125); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[125], tbwbs, tbwbh, valid_bwb125); + $setuphold (posedge CLK &&& WEA, posedge DA[126], tdas, tdah, valid_da126); + $setuphold (posedge CLK &&& WEA, negedge DA[126], tdas, tdah, valid_da126); + $setuphold (posedge CLK &&& WEB, posedge DB[126], tdbs, tdbh, valid_db126); + $setuphold (posedge CLK &&& WEB, negedge DB[126], tdbs, tdbh, valid_db126); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[126], tbwas, tbwah, valid_bwa126); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[126], tbwas, tbwah, valid_bwa126); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[126], tbwbs, tbwbh, valid_bwb126); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[126], tbwbs, tbwbh, valid_bwb126); + $setuphold (posedge CLK &&& WEA, posedge DA[127], tdas, tdah, valid_da127); + $setuphold (posedge CLK &&& WEA, negedge DA[127], tdas, tdah, valid_da127); + $setuphold (posedge CLK &&& WEB, posedge DB[127], tdbs, tdbh, valid_db127); + $setuphold (posedge CLK &&& WEB, negedge DB[127], tdbs, tdbh, valid_db127); + + $setuphold (posedge CLK &&& WEA, posedge BWEBA[127], tbwas, tbwah, valid_bwa127); + $setuphold (posedge CLK &&& WEA, negedge BWEBA[127], tbwas, tbwah, valid_bwa127); + $setuphold (posedge CLK &&& WEB, posedge BWEBB[127], tbwbs, tbwbh, valid_bwb127); + $setuphold (posedge CLK &&& WEB, negedge BWEBB[127], tbwbs, tbwbh, valid_bwb127); + $setuphold (posedge CLK &&& CSA, posedge WEBA, twas, twah, valid_wea); + $setuphold (posedge CLK &&& CSA, negedge WEBA, twas, twah, valid_wea); + $setuphold (posedge CLK &&& CSB, posedge WEBB, twbs, twbh, valid_web); + $setuphold (posedge CLK &&& CSB, negedge WEBB, twbs, twbh, valid_web); + + $setuphold (posedge CLK, posedge CEBA, tcas, tcah, valid_cea); + $setuphold (posedge CLK, negedge CEBA, tcas, tcah, valid_cea); + $setuphold (posedge CLK, posedge CEBB, tcbs, tcbh, valid_ceb); + $setuphold (posedge CLK, negedge CEBB, tcbs, tcbh, valid_ceb); + + $width (negedge CLK &&& check_ceb, tckl, 0, valid_ck); + $width (posedge CLK &&& check_ceb, tckh, 0, valid_ck); + $period (posedge CLK &&& check_ceb, tcyc, valid_ck); + $period (negedge CLK &&& check_ceb, tcyc, valid_ck); + + +if(!CEBA & WEBA) (posedge CLK => (QA[0] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[0] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[1] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[1] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[2] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[2] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[3] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[3] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[4] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[4] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[5] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[5] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[6] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[6] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[7] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[7] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[8] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[8] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[9] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[9] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[10] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[10] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[11] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[11] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[12] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[12] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[13] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[13] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[14] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[14] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[15] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[15] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[16] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[16] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[17] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[17] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[18] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[18] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[19] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[19] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[20] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[20] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[21] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[21] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[22] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[22] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[23] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[23] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[24] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[24] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[25] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[25] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[26] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[26] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[27] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[27] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[28] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[28] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[29] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[29] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[30] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[30] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[31] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[31] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[32] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[32] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[33] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[33] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[34] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[34] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[35] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[35] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[36] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[36] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[37] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[37] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[38] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[38] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[39] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[39] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[40] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[40] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[41] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[41] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[42] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[42] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[43] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[43] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[44] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[44] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[45] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[45] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[46] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[46] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[47] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[47] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[48] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[48] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[49] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[49] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[50] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[50] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[51] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[51] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[52] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[52] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[53] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[53] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[54] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[54] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[55] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[55] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[56] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[56] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[57] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[57] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[58] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[58] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[59] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[59] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[60] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[60] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[61] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[61] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[62] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[62] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[63] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[63] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[64] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[64] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[65] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[65] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[66] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[66] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[67] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[67] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[68] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[68] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[69] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[69] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[70] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[70] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[71] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[71] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[72] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[72] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[73] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[73] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[74] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[74] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[75] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[75] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[76] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[76] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[77] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[77] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[78] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[78] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[79] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[79] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[80] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[80] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[81] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[81] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[82] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[82] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[83] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[83] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[84] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[84] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[85] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[85] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[86] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[86] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[87] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[87] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[88] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[88] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[89] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[89] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[90] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[90] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[91] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[91] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[92] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[92] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[93] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[93] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[94] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[94] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[95] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[95] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[96] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[96] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[97] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[97] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[98] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[98] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[99] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[99] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[100] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[100] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[101] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[101] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[102] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[102] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[103] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[103] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[104] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[104] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[105] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[105] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[106] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[106] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[107] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[107] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[108] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[108] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[109] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[109] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[110] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[110] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[111] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[111] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[112] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[112] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[113] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[113] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[114] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[114] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[115] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[115] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[116] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[116] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[117] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[117] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[118] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[118] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[119] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[119] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[120] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[120] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[121] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[121] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[122] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[122] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[123] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[123] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[124] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[124] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[125] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[125] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[126] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[126] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +if(!CEBA & WEBA) (posedge CLK => (QA[127] : 1'bx)) = (tcda,tcda,tholda,tcda,tholda,tcda); +if(!CEBB & WEBB) (posedge CLK => (QB[127] : 1'bx)) = (tcdb,tcdb,tholdb,tcdb,tholdb,tcdb); + + + + +endspecify +`endif + +initial begin + assign EN = 1; + RDA = 1; + RDB = 1; + ABL = 1'b1; + AAL = {M{1'b0}}; + BWEBAL = {N{1'b1}}; + BWEBBL = {N{1'b1}}; + CEBAL = 1'b1; + CEBBL = 1'b1; + clk_count = 0; + sd_mode = 0; + invalid_aslp = 1'b0; + invalid_bslp = 1'b0; + invalid_adslp = 1'b0; + invalid_bdslp = 1'b0; + invalid_sdwk_dslp = 1'b0; +end + +`ifdef TSMC_INITIALIZE_MEM +initial + begin +`ifdef TSMC_INITIALIZE_FORMAT_BINARY + #(INITIAL_MEM_DELAY) $readmemb(cdeFileInit, MX.mem, 0, W-1); +`else + #(INITIAL_MEM_DELAY) $readmemh(cdeFileInit, MX.mem, 0, W-1); +`endif + end +`endif // `ifdef TSMC_INITIALIZE_MEM + +`ifdef TSMC_INITIALIZE_FAULT +initial + begin +`ifdef TSMC_INITIALIZE_FORMAT_BINARY + #(INITIAL_FAULT_DELAY) $readmemb(cdeFileFault, MX.mem_fault, 0, W-1); +`else + #(INITIAL_FAULT_DELAY) $readmemh(cdeFileFault, MX.mem_fault, 0, W-1); +`endif + end +`endif // `ifdef TSMC_INITIALIZE_FAULT + + +always @(bRTSEL) begin + if (bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0) begin + if(($realtime > 0) && (!CEBAL || !CEBBL) ) begin +`ifdef no_warning +`else + $display("\tWarning %m : input RTSEL should not be toggled when CEBA/CEBB is low at simulation time %t\n", $realtime); +`endif + `ifdef TSMC_CM_UNIT_DELAY + #(SRAM_DELAY); + `endif + bQA = {N{1'bx}}; + bQB = {N{1'bx}}; + xMemoryAll; + end + end +end +always @(bWTSEL) begin + if (bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0) begin + if(($realtime > 0) && (!CEBAL || !CEBBL) ) begin +`ifdef no_warning +`else + $display("\tWarning %m : input WTSEL should not be toggled when CEBA/CEBB is low at simulation time %t\n", $realtime); +`endif + `ifdef TSMC_CM_UNIT_DELAY + #(SRAM_DELAY); + `endif + bQA = {N{1'bx}}; + bQB = {N{1'bx}}; + xMemoryAll; + end + end +end +always @(bPTSEL) begin + if (bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0) begin + if(($realtime > 0) && (!CEBAL || !CEBBL) ) begin +`ifdef no_warning +`else + $display("\tWarning %m : input PTSEL should not be toggled when CEBA/CEBB is low at simulation time %t\n", $realtime); +`endif + `ifdef TSMC_CM_UNIT_DELAY + #(SRAM_DELAY); + `endif + bQA = {N{1'bx}}; + bQB = {N{1'bx}}; + xMemoryAll; + end + end +end + +`ifdef TSMC_NO_TESTPINS_WARNING +`else +always @(bCLKA or bCLKB or bRTSEL) +begin + if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0) begin + if((bRTSEL !== 2'b00) && ($realtime > 0)) + begin + $display("\tError %m : input RTSEL should be set to 2'b00 at simulation time %t\n", $realtime); + $display("\tError %m : Please refer the datasheet for the RTSEL setting in the different segment and mux configuration\n"); + bQA <= #0.01 {N{1'bx}}; + bQB <= #0.01 {N{1'bx}}; + AAL <= {M{1'bx}}; + BWEBAL <= {N{1'b0}}; + end + end +end + +always @(bCLKA or bCLKB or bWTSEL) +begin + if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0) begin + if((bWTSEL !== 2'b00) && ($realtime > 0)) + begin + $display("\tError %m : input WTSEL should be set to 2'b00 at simulation time %t\n", $realtime); + $display("\tError %m : Please refer the datasheet for the WTSEL setting in the different segment and mux configuration\n"); + bQA <= #0.01 {N{1'bx}}; + bQB <= #0.01 {N{1'bx}}; + AAL <= {M{1'bx}}; + BWEBAL <= {N{1'b0}}; + end + end +end + +always @(bCLKA or bCLKB or bPTSEL) +begin + if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0) begin + if((bPTSEL !== 2'b00) && ($realtime > 0)) + begin + $display("\tError %m : input PTSEL should be set to 2'b00 at simulation time %t\n", $realtime); + $display("\tError %m : Please refer the datasheet for the PTSEL setting in the different segment and mux configuration\n"); + bQA <= #0.01 {N{1'bx}}; + bQB <= #0.01 {N{1'bx}}; + AAL <= {M{1'bx}}; + BWEBAL <= {N{1'b0}}; + end + end +end + +`endif + +//always @(bTMA or bTMB) begin +// if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0 && bTMA === 1'b1 && bTMB === 1'b1) begin +// if( MES_ALL=="ON" && $realtime != 0) +// begin +// $display("\nWarning %m : TMA and TMB cannot both be 1 at the same time, at %t. >>", $realtime); +// end +// xMemoryAll; +//`ifdef TSMC_CM_UNIT_DELAY +// bQA <= #(SRAM_DELAY + 0.001) {N{1'bx}}; +// bQB <= #(SRAM_DELAY + 0.001) {N{1'bx}}; +//`else +// bQA <= #0.01 {N{1'bx}}; +// bQB <= #0.01 {N{1'bx}}; +//`endif +// end +//end + +always @(bCLKA) +begin : CLKAOP + if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0 && invalid_sdwk_dslp === 1'b0) begin + if(bCLKA === 1'bx) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m : CLK unknown at %t. >>", $realtime); + end + xMemoryAll; + bQA <= #0.01 {N{1'bx}}; + end + else if(bCLKA === 1'b1 && RCLKA === 1'b0) + begin + if(bCEBA === 1'bx) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m CEBA unknown at %t. >>", $realtime); + end + xMemoryAll; + bQA <= #0.01 {N{1'bx}}; + end + else if(bWEBA === 1'bx && bCEBA === 1'b0) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m WEBA unknown at %t. >>", $realtime); + end + xMemoryAll; + bQA <= #0.01 {N{1'bx}}; + end + else begin + WEBAL = bWEBA; + CEBAL = bCEBA; + if(^bAA === 1'bx && bWEBA === 1'b0 && bCEBA === 1'b0) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m WRITE AA unknown at %t. >>", $realtime); + end + xMemoryAll; + end + else if(^bAA === 1'bx && bWEBA === 1'b1 && bCEBA === 1'b0) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m READ AA unknown at %t. >>", $realtime); + end + xMemoryAll; + bQA <= #0.01 {N{1'bx}}; + end + else + begin + if(!bCEBA) + begin // begin if(bCEBA) + AAL = bAA; + DAL = bDA; + if(bWEBA === 1'b1 && clk_count == 0) + begin + RDA = ~RDA; + end + if(bWEBA === 1'b0) + begin + for (i = 0; i < N; i = i + 1) + begin + if(!bBWEBA[i] && !bWEBA) + begin + BWEBAL[i] = 1'b0; + end + if(bWEBA === 1'bx || bBWEBA[i] === 1'bx) + begin + BWEBAL[i] = 1'b0; + DAL[i] = 1'bx; + end + end + if(^bBWEBA === 1'bx) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m BWEBA unknown at %t. >>", $realtime); + end + end + end + end + end + end + + CEBBL = bCEBB; + if(bCEBB === 1'b0) begin + WEBBL = bWEBB; + ABL = bAB; + bBWEBBL = bBWEBB; + bDBL = bDB; + end + #0.001; + + if(CEBBL === 1'bx) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m CEBB unknown at %t. >>", $realtime); + end + xMemoryAll; + bQB <= #0.01 {N{1'bx}}; + end + else if(WEBBL === 1'bx && CEBBL === 1'b0) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m WEBB unknown at %t. >>", $realtime); + end + xMemoryAll; + bQB <= #0.01 {N{1'bx}}; + end + else + begin + if(^ABL === 1'bx && WEBBL === 1'b0 && CEBBL === 1'b0) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m WRITE AB unknown at %t. >>", $realtime); + end + xMemoryAll; + end + else if(^ABL === 1'bx && WEBBL === 1'b1 && CEBBL === 1'b0) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m READ AB unknown at %t. >>", $realtime); + end + xMemoryAll; + bQB <= #0.01 {N{1'bx}}; + end + else begin + if(!CEBBL) + begin // begin if(CEBBL) + DBL = bDBL; + if(WEBBL === 1'b1 && clk_count == 0) + begin + RDB = ~RDB; + end + if(WEBBL !== 1'b1) + begin + for (i = 0; i < N; i = i + 1) + begin + if(!bBWEBBL[i] && !WEBBL) + begin + BWEBBL[i] = 1'b0; + end + if(WEBBL === 1'bx || bBWEBBL[i] === 1'bx) + begin + BWEBBL[i] = 1'b0; + DBL[i] = 1'bx; + end + end + if(^bBWEBBL === 1'bx) + begin + if( MES_ALL=="ON" && $realtime != 0) + begin + $display("\nWarning %m BWEBB unknown at %t. >>", $realtime); + end + end + end + end + end + end + end + end + #0.001 RCLKA = bCLKA; + +end + + + +always @(RDA or QAL) +begin : CLKAROP + if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0 && invalid_sdwk_dslp === 1'b0 && bAWT === 1'b0) begin + if(!CEBAL && WEBAL && clk_count == 0) + begin + begin +`ifdef TSMC_CM_UNIT_DELAY + #(SRAM_DELAY); +`else + bQA = {N{1'bx}}; + #0.01; +`endif + bQA <= QAL; + end + end // if(!CEBAL && WEBAL && clk_count == 0) + end +end // always @ (RDA or QAL) + +always @(RDB or QBL) +begin : CLKBROP + if(bSLP === 1'b0 && bDSLP === 1'b0 && bSD === 1'b0 && invalid_sdwk_dslp === 1'b0 && bAWT === 1'b0) begin + if(!CEBBL && WEBBL && clk_count == 0) + begin + begin +`ifdef TSMC_CM_UNIT_DELAY + #(SRAM_DELAY); +`else + bQB = {N{1'bx}}; + #0.01; +`endif + bQB <= QBL; + end + end // if(!bAWT && !CEBBL && WEBBL && clk_count == 0) + end +end // always @ (RDB or QBL) + + + + + +always @(BWEBAL) +begin + BWEBAL = #0.01 {N{1'b1}}; +end + +always @(BWEBBL) +begin + BWEBBL = #0.01 {N{1'b1}}; +end + + +`ifdef TSMC_CM_UNIT_DELAY +`else +always @(valid_testpin) begin + AAL <= {M{1'bx}}; + BWEBAL <= {N{1'b0}}; + BWEBBL <= {N{1'b0}}; + bQA = #0.01 {N{1'bx}}; + bQB = #0.01 {N{1'bx}}; +end + + +always @(valid_ck) +begin + if (iCEBA === 1'b0) begin + #0.002; + AAL = {M{1'bx}}; + BWEBAL = {N{1'b0}}; + bQA = #0.01 {N{1'bx}}; + end + + if (iCEBB === 1'b0) begin + #0.002; + ABL = {M{1'bx}}; + BWEBBL = {N{1'b0}}; + bQB = #0.01 {N{1'bx}}; + end +end + + +always @(valid_cka) +begin + + #0.002; + AAL = {M{1'bx}}; + BWEBAL = {N{1'b0}}; + bQA = #0.01 {N{1'bx}}; +end + +always @(valid_ckb) +begin + + #0.002; + ABL = {M{1'bx}}; + BWEBBL = {N{1'b0}}; + bQB = #0.01 {N{1'bx}}; +end + + +always @(valid_aa) +begin + + if(!WEBAL) + begin + #0.002; + BWEBAL = {N{1'b0}}; + AAL = {M{1'bx}}; + end + else + begin + #0.002; + BWEBAL = {N{1'b0}}; + AAL = {M{1'bx}}; + bQA = #0.01 {N{1'bx}}; + end +end + +always @(valid_ab) +begin + + if(!WEBBL) + begin + BWEBBL = {N{1'b0}}; + ABL = {M{1'bx}}; + end + else + begin + #0.002; + BWEBBL = {N{1'b0}}; + ABL = {M{1'bx}}; + bQB = #0.01 {N{1'bx}}; + end +end + +always @(valid_da0) +begin + + DAL[0] = 1'bx; + BWEBAL[0] = 1'b0; +end + +always @(valid_db0) +begin + disable CLKAOP; + DBL[0] = 1'bx; + BWEBBL[0] = 1'b0; +end + +always @(valid_bwa0) +begin + + DAL[0] = 1'bx; + BWEBAL[0] = 1'b0; +end + +always @(valid_bwb0) +begin + disable CLKAOP; + DBL[0] = 1'bx; + BWEBBL[0] = 1'b0; +end +always @(valid_da1) +begin + + DAL[1] = 1'bx; + BWEBAL[1] = 1'b0; +end + +always @(valid_db1) +begin + disable CLKAOP; + DBL[1] = 1'bx; + BWEBBL[1] = 1'b0; +end + +always @(valid_bwa1) +begin + + DAL[1] = 1'bx; + BWEBAL[1] = 1'b0; +end + +always @(valid_bwb1) +begin + disable CLKAOP; + DBL[1] = 1'bx; + BWEBBL[1] = 1'b0; +end +always @(valid_da2) +begin + + DAL[2] = 1'bx; + BWEBAL[2] = 1'b0; +end + +always @(valid_db2) +begin + disable CLKAOP; + DBL[2] = 1'bx; + BWEBBL[2] = 1'b0; +end + +always @(valid_bwa2) +begin + + DAL[2] = 1'bx; + BWEBAL[2] = 1'b0; +end + +always @(valid_bwb2) +begin + disable CLKAOP; + DBL[2] = 1'bx; + BWEBBL[2] = 1'b0; +end +always @(valid_da3) +begin + + DAL[3] = 1'bx; + BWEBAL[3] = 1'b0; +end + +always @(valid_db3) +begin + disable CLKAOP; + DBL[3] = 1'bx; + BWEBBL[3] = 1'b0; +end + +always @(valid_bwa3) +begin + + DAL[3] = 1'bx; + BWEBAL[3] = 1'b0; +end + +always @(valid_bwb3) +begin + disable CLKAOP; + DBL[3] = 1'bx; + BWEBBL[3] = 1'b0; +end +always @(valid_da4) +begin + + DAL[4] = 1'bx; + BWEBAL[4] = 1'b0; +end + +always @(valid_db4) +begin + disable CLKAOP; + DBL[4] = 1'bx; + BWEBBL[4] = 1'b0; +end + +always @(valid_bwa4) +begin + + DAL[4] = 1'bx; + BWEBAL[4] = 1'b0; +end + +always @(valid_bwb4) +begin + disable CLKAOP; + DBL[4] = 1'bx; + BWEBBL[4] = 1'b0; +end +always @(valid_da5) +begin + + DAL[5] = 1'bx; + BWEBAL[5] = 1'b0; +end + +always @(valid_db5) +begin + disable CLKAOP; + DBL[5] = 1'bx; + BWEBBL[5] = 1'b0; +end + +always @(valid_bwa5) +begin + + DAL[5] = 1'bx; + BWEBAL[5] = 1'b0; +end + +always @(valid_bwb5) +begin + disable CLKAOP; + DBL[5] = 1'bx; + BWEBBL[5] = 1'b0; +end +always @(valid_da6) +begin + + DAL[6] = 1'bx; + BWEBAL[6] = 1'b0; +end + +always @(valid_db6) +begin + disable CLKAOP; + DBL[6] = 1'bx; + BWEBBL[6] = 1'b0; +end + +always @(valid_bwa6) +begin + + DAL[6] = 1'bx; + BWEBAL[6] = 1'b0; +end + +always @(valid_bwb6) +begin + disable CLKAOP; + DBL[6] = 1'bx; + BWEBBL[6] = 1'b0; +end +always @(valid_da7) +begin + + DAL[7] = 1'bx; + BWEBAL[7] = 1'b0; +end + +always @(valid_db7) +begin + disable CLKAOP; + DBL[7] = 1'bx; + BWEBBL[7] = 1'b0; +end + +always @(valid_bwa7) +begin + + DAL[7] = 1'bx; + BWEBAL[7] = 1'b0; +end + +always @(valid_bwb7) +begin + disable CLKAOP; + DBL[7] = 1'bx; + BWEBBL[7] = 1'b0; +end +always @(valid_da8) +begin + + DAL[8] = 1'bx; + BWEBAL[8] = 1'b0; +end + +always @(valid_db8) +begin + disable CLKAOP; + DBL[8] = 1'bx; + BWEBBL[8] = 1'b0; +end + +always @(valid_bwa8) +begin + + DAL[8] = 1'bx; + BWEBAL[8] = 1'b0; +end + +always @(valid_bwb8) +begin + disable CLKAOP; + DBL[8] = 1'bx; + BWEBBL[8] = 1'b0; +end +always @(valid_da9) +begin + + DAL[9] = 1'bx; + BWEBAL[9] = 1'b0; +end + +always @(valid_db9) +begin + disable CLKAOP; + DBL[9] = 1'bx; + BWEBBL[9] = 1'b0; +end + +always @(valid_bwa9) +begin + + DAL[9] = 1'bx; + BWEBAL[9] = 1'b0; +end + +always @(valid_bwb9) +begin + disable CLKAOP; + DBL[9] = 1'bx; + BWEBBL[9] = 1'b0; +end +always @(valid_da10) +begin + + DAL[10] = 1'bx; + BWEBAL[10] = 1'b0; +end + +always @(valid_db10) +begin + disable CLKAOP; + DBL[10] = 1'bx; + BWEBBL[10] = 1'b0; +end + +always @(valid_bwa10) +begin + + DAL[10] = 1'bx; + BWEBAL[10] = 1'b0; +end + +always @(valid_bwb10) +begin + disable CLKAOP; + DBL[10] = 1'bx; + BWEBBL[10] = 1'b0; +end +always @(valid_da11) +begin + + DAL[11] = 1'bx; + BWEBAL[11] = 1'b0; +end + +always @(valid_db11) +begin + disable CLKAOP; + DBL[11] = 1'bx; + BWEBBL[11] = 1'b0; +end + +always @(valid_bwa11) +begin + + DAL[11] = 1'bx; + BWEBAL[11] = 1'b0; +end + +always @(valid_bwb11) +begin + disable CLKAOP; + DBL[11] = 1'bx; + BWEBBL[11] = 1'b0; +end +always @(valid_da12) +begin + + DAL[12] = 1'bx; + BWEBAL[12] = 1'b0; +end + +always @(valid_db12) +begin + disable CLKAOP; + DBL[12] = 1'bx; + BWEBBL[12] = 1'b0; +end + +always @(valid_bwa12) +begin + + DAL[12] = 1'bx; + BWEBAL[12] = 1'b0; +end + +always @(valid_bwb12) +begin + disable CLKAOP; + DBL[12] = 1'bx; + BWEBBL[12] = 1'b0; +end +always @(valid_da13) +begin + + DAL[13] = 1'bx; + BWEBAL[13] = 1'b0; +end + +always @(valid_db13) +begin + disable CLKAOP; + DBL[13] = 1'bx; + BWEBBL[13] = 1'b0; +end + +always @(valid_bwa13) +begin + + DAL[13] = 1'bx; + BWEBAL[13] = 1'b0; +end + +always @(valid_bwb13) +begin + disable CLKAOP; + DBL[13] = 1'bx; + BWEBBL[13] = 1'b0; +end +always @(valid_da14) +begin + + DAL[14] = 1'bx; + BWEBAL[14] = 1'b0; +end + +always @(valid_db14) +begin + disable CLKAOP; + DBL[14] = 1'bx; + BWEBBL[14] = 1'b0; +end + +always @(valid_bwa14) +begin + + DAL[14] = 1'bx; + BWEBAL[14] = 1'b0; +end + +always @(valid_bwb14) +begin + disable CLKAOP; + DBL[14] = 1'bx; + BWEBBL[14] = 1'b0; +end +always @(valid_da15) +begin + + DAL[15] = 1'bx; + BWEBAL[15] = 1'b0; +end + +always @(valid_db15) +begin + disable CLKAOP; + DBL[15] = 1'bx; + BWEBBL[15] = 1'b0; +end + +always @(valid_bwa15) +begin + + DAL[15] = 1'bx; + BWEBAL[15] = 1'b0; +end + +always @(valid_bwb15) +begin + disable CLKAOP; + DBL[15] = 1'bx; + BWEBBL[15] = 1'b0; +end +always @(valid_da16) +begin + + DAL[16] = 1'bx; + BWEBAL[16] = 1'b0; +end + +always @(valid_db16) +begin + disable CLKAOP; + DBL[16] = 1'bx; + BWEBBL[16] = 1'b0; +end + +always @(valid_bwa16) +begin + + DAL[16] = 1'bx; + BWEBAL[16] = 1'b0; +end + +always @(valid_bwb16) +begin + disable CLKAOP; + DBL[16] = 1'bx; + BWEBBL[16] = 1'b0; +end +always @(valid_da17) +begin + + DAL[17] = 1'bx; + BWEBAL[17] = 1'b0; +end + +always @(valid_db17) +begin + disable CLKAOP; + DBL[17] = 1'bx; + BWEBBL[17] = 1'b0; +end + +always @(valid_bwa17) +begin + + DAL[17] = 1'bx; + BWEBAL[17] = 1'b0; +end + +always @(valid_bwb17) +begin + disable CLKAOP; + DBL[17] = 1'bx; + BWEBBL[17] = 1'b0; +end +always @(valid_da18) +begin + + DAL[18] = 1'bx; + BWEBAL[18] = 1'b0; +end + +always @(valid_db18) +begin + disable CLKAOP; + DBL[18] = 1'bx; + BWEBBL[18] = 1'b0; +end + +always @(valid_bwa18) +begin + + DAL[18] = 1'bx; + BWEBAL[18] = 1'b0; +end + +always @(valid_bwb18) +begin + disable CLKAOP; + DBL[18] = 1'bx; + BWEBBL[18] = 1'b0; +end +always @(valid_da19) +begin + + DAL[19] = 1'bx; + BWEBAL[19] = 1'b0; +end + +always @(valid_db19) +begin + disable CLKAOP; + DBL[19] = 1'bx; + BWEBBL[19] = 1'b0; +end + +always @(valid_bwa19) +begin + + DAL[19] = 1'bx; + BWEBAL[19] = 1'b0; +end + +always @(valid_bwb19) +begin + disable CLKAOP; + DBL[19] = 1'bx; + BWEBBL[19] = 1'b0; +end +always @(valid_da20) +begin + + DAL[20] = 1'bx; + BWEBAL[20] = 1'b0; +end + +always @(valid_db20) +begin + disable CLKAOP; + DBL[20] = 1'bx; + BWEBBL[20] = 1'b0; +end + +always @(valid_bwa20) +begin + + DAL[20] = 1'bx; + BWEBAL[20] = 1'b0; +end + +always @(valid_bwb20) +begin + disable CLKAOP; + DBL[20] = 1'bx; + BWEBBL[20] = 1'b0; +end +always @(valid_da21) +begin + + DAL[21] = 1'bx; + BWEBAL[21] = 1'b0; +end + +always @(valid_db21) +begin + disable CLKAOP; + DBL[21] = 1'bx; + BWEBBL[21] = 1'b0; +end + +always @(valid_bwa21) +begin + + DAL[21] = 1'bx; + BWEBAL[21] = 1'b0; +end + +always @(valid_bwb21) +begin + disable CLKAOP; + DBL[21] = 1'bx; + BWEBBL[21] = 1'b0; +end +always @(valid_da22) +begin + + DAL[22] = 1'bx; + BWEBAL[22] = 1'b0; +end + +always @(valid_db22) +begin + disable CLKAOP; + DBL[22] = 1'bx; + BWEBBL[22] = 1'b0; +end + +always @(valid_bwa22) +begin + + DAL[22] = 1'bx; + BWEBAL[22] = 1'b0; +end + +always @(valid_bwb22) +begin + disable CLKAOP; + DBL[22] = 1'bx; + BWEBBL[22] = 1'b0; +end +always @(valid_da23) +begin + + DAL[23] = 1'bx; + BWEBAL[23] = 1'b0; +end + +always @(valid_db23) +begin + disable CLKAOP; + DBL[23] = 1'bx; + BWEBBL[23] = 1'b0; +end + +always @(valid_bwa23) +begin + + DAL[23] = 1'bx; + BWEBAL[23] = 1'b0; +end + +always @(valid_bwb23) +begin + disable CLKAOP; + DBL[23] = 1'bx; + BWEBBL[23] = 1'b0; +end +always @(valid_da24) +begin + + DAL[24] = 1'bx; + BWEBAL[24] = 1'b0; +end + +always @(valid_db24) +begin + disable CLKAOP; + DBL[24] = 1'bx; + BWEBBL[24] = 1'b0; +end + +always @(valid_bwa24) +begin + + DAL[24] = 1'bx; + BWEBAL[24] = 1'b0; +end + +always @(valid_bwb24) +begin + disable CLKAOP; + DBL[24] = 1'bx; + BWEBBL[24] = 1'b0; +end +always @(valid_da25) +begin + + DAL[25] = 1'bx; + BWEBAL[25] = 1'b0; +end + +always @(valid_db25) +begin + disable CLKAOP; + DBL[25] = 1'bx; + BWEBBL[25] = 1'b0; +end + +always @(valid_bwa25) +begin + + DAL[25] = 1'bx; + BWEBAL[25] = 1'b0; +end + +always @(valid_bwb25) +begin + disable CLKAOP; + DBL[25] = 1'bx; + BWEBBL[25] = 1'b0; +end +always @(valid_da26) +begin + + DAL[26] = 1'bx; + BWEBAL[26] = 1'b0; +end + +always @(valid_db26) +begin + disable CLKAOP; + DBL[26] = 1'bx; + BWEBBL[26] = 1'b0; +end + +always @(valid_bwa26) +begin + + DAL[26] = 1'bx; + BWEBAL[26] = 1'b0; +end + +always @(valid_bwb26) +begin + disable CLKAOP; + DBL[26] = 1'bx; + BWEBBL[26] = 1'b0; +end +always @(valid_da27) +begin + + DAL[27] = 1'bx; + BWEBAL[27] = 1'b0; +end + +always @(valid_db27) +begin + disable CLKAOP; + DBL[27] = 1'bx; + BWEBBL[27] = 1'b0; +end + +always @(valid_bwa27) +begin + + DAL[27] = 1'bx; + BWEBAL[27] = 1'b0; +end + +always @(valid_bwb27) +begin + disable CLKAOP; + DBL[27] = 1'bx; + BWEBBL[27] = 1'b0; +end +always @(valid_da28) +begin + + DAL[28] = 1'bx; + BWEBAL[28] = 1'b0; +end + +always @(valid_db28) +begin + disable CLKAOP; + DBL[28] = 1'bx; + BWEBBL[28] = 1'b0; +end + +always @(valid_bwa28) +begin + + DAL[28] = 1'bx; + BWEBAL[28] = 1'b0; +end + +always @(valid_bwb28) +begin + disable CLKAOP; + DBL[28] = 1'bx; + BWEBBL[28] = 1'b0; +end +always @(valid_da29) +begin + + DAL[29] = 1'bx; + BWEBAL[29] = 1'b0; +end + +always @(valid_db29) +begin + disable CLKAOP; + DBL[29] = 1'bx; + BWEBBL[29] = 1'b0; +end + +always @(valid_bwa29) +begin + + DAL[29] = 1'bx; + BWEBAL[29] = 1'b0; +end + +always @(valid_bwb29) +begin + disable CLKAOP; + DBL[29] = 1'bx; + BWEBBL[29] = 1'b0; +end +always @(valid_da30) +begin + + DAL[30] = 1'bx; + BWEBAL[30] = 1'b0; +end + +always @(valid_db30) +begin + disable CLKAOP; + DBL[30] = 1'bx; + BWEBBL[30] = 1'b0; +end + +always @(valid_bwa30) +begin + + DAL[30] = 1'bx; + BWEBAL[30] = 1'b0; +end + +always @(valid_bwb30) +begin + disable CLKAOP; + DBL[30] = 1'bx; + BWEBBL[30] = 1'b0; +end +always @(valid_da31) +begin + + DAL[31] = 1'bx; + BWEBAL[31] = 1'b0; +end + +always @(valid_db31) +begin + disable CLKAOP; + DBL[31] = 1'bx; + BWEBBL[31] = 1'b0; +end + +always @(valid_bwa31) +begin + + DAL[31] = 1'bx; + BWEBAL[31] = 1'b0; +end + +always @(valid_bwb31) +begin + disable CLKAOP; + DBL[31] = 1'bx; + BWEBBL[31] = 1'b0; +end +always @(valid_da32) +begin + + DAL[32] = 1'bx; + BWEBAL[32] = 1'b0; +end + +always @(valid_db32) +begin + disable CLKAOP; + DBL[32] = 1'bx; + BWEBBL[32] = 1'b0; +end + +always @(valid_bwa32) +begin + + DAL[32] = 1'bx; + BWEBAL[32] = 1'b0; +end + +always @(valid_bwb32) +begin + disable CLKAOP; + DBL[32] = 1'bx; + BWEBBL[32] = 1'b0; +end +always @(valid_da33) +begin + + DAL[33] = 1'bx; + BWEBAL[33] = 1'b0; +end + +always @(valid_db33) +begin + disable CLKAOP; + DBL[33] = 1'bx; + BWEBBL[33] = 1'b0; +end + +always @(valid_bwa33) +begin + + DAL[33] = 1'bx; + BWEBAL[33] = 1'b0; +end + +always @(valid_bwb33) +begin + disable CLKAOP; + DBL[33] = 1'bx; + BWEBBL[33] = 1'b0; +end +always @(valid_da34) +begin + + DAL[34] = 1'bx; + BWEBAL[34] = 1'b0; +end + +always @(valid_db34) +begin + disable CLKAOP; + DBL[34] = 1'bx; + BWEBBL[34] = 1'b0; +end + +always @(valid_bwa34) +begin + + DAL[34] = 1'bx; + BWEBAL[34] = 1'b0; +end + +always @(valid_bwb34) +begin + disable CLKAOP; + DBL[34] = 1'bx; + BWEBBL[34] = 1'b0; +end +always @(valid_da35) +begin + + DAL[35] = 1'bx; + BWEBAL[35] = 1'b0; +end + +always @(valid_db35) +begin + disable CLKAOP; + DBL[35] = 1'bx; + BWEBBL[35] = 1'b0; +end + +always @(valid_bwa35) +begin + + DAL[35] = 1'bx; + BWEBAL[35] = 1'b0; +end + +always @(valid_bwb35) +begin + disable CLKAOP; + DBL[35] = 1'bx; + BWEBBL[35] = 1'b0; +end +always @(valid_da36) +begin + + DAL[36] = 1'bx; + BWEBAL[36] = 1'b0; +end + +always @(valid_db36) +begin + disable CLKAOP; + DBL[36] = 1'bx; + BWEBBL[36] = 1'b0; +end + +always @(valid_bwa36) +begin + + DAL[36] = 1'bx; + BWEBAL[36] = 1'b0; +end + +always @(valid_bwb36) +begin + disable CLKAOP; + DBL[36] = 1'bx; + BWEBBL[36] = 1'b0; +end +always @(valid_da37) +begin + + DAL[37] = 1'bx; + BWEBAL[37] = 1'b0; +end + +always @(valid_db37) +begin + disable CLKAOP; + DBL[37] = 1'bx; + BWEBBL[37] = 1'b0; +end + +always @(valid_bwa37) +begin + + DAL[37] = 1'bx; + BWEBAL[37] = 1'b0; +end + +always @(valid_bwb37) +begin + disable CLKAOP; + DBL[37] = 1'bx; + BWEBBL[37] = 1'b0; +end +always @(valid_da38) +begin + + DAL[38] = 1'bx; + BWEBAL[38] = 1'b0; +end + +always @(valid_db38) +begin + disable CLKAOP; + DBL[38] = 1'bx; + BWEBBL[38] = 1'b0; +end + +always @(valid_bwa38) +begin + + DAL[38] = 1'bx; + BWEBAL[38] = 1'b0; +end + +always @(valid_bwb38) +begin + disable CLKAOP; + DBL[38] = 1'bx; + BWEBBL[38] = 1'b0; +end +always @(valid_da39) +begin + + DAL[39] = 1'bx; + BWEBAL[39] = 1'b0; +end + +always @(valid_db39) +begin + disable CLKAOP; + DBL[39] = 1'bx; + BWEBBL[39] = 1'b0; +end + +always @(valid_bwa39) +begin + + DAL[39] = 1'bx; + BWEBAL[39] = 1'b0; +end + +always @(valid_bwb39) +begin + disable CLKAOP; + DBL[39] = 1'bx; + BWEBBL[39] = 1'b0; +end +always @(valid_da40) +begin + + DAL[40] = 1'bx; + BWEBAL[40] = 1'b0; +end + +always @(valid_db40) +begin + disable CLKAOP; + DBL[40] = 1'bx; + BWEBBL[40] = 1'b0; +end + +always @(valid_bwa40) +begin + + DAL[40] = 1'bx; + BWEBAL[40] = 1'b0; +end + +always @(valid_bwb40) +begin + disable CLKAOP; + DBL[40] = 1'bx; + BWEBBL[40] = 1'b0; +end +always @(valid_da41) +begin + + DAL[41] = 1'bx; + BWEBAL[41] = 1'b0; +end + +always @(valid_db41) +begin + disable CLKAOP; + DBL[41] = 1'bx; + BWEBBL[41] = 1'b0; +end + +always @(valid_bwa41) +begin + + DAL[41] = 1'bx; + BWEBAL[41] = 1'b0; +end + +always @(valid_bwb41) +begin + disable CLKAOP; + DBL[41] = 1'bx; + BWEBBL[41] = 1'b0; +end +always @(valid_da42) +begin + + DAL[42] = 1'bx; + BWEBAL[42] = 1'b0; +end + +always @(valid_db42) +begin + disable CLKAOP; + DBL[42] = 1'bx; + BWEBBL[42] = 1'b0; +end + +always @(valid_bwa42) +begin + + DAL[42] = 1'bx; + BWEBAL[42] = 1'b0; +end + +always @(valid_bwb42) +begin + disable CLKAOP; + DBL[42] = 1'bx; + BWEBBL[42] = 1'b0; +end +always @(valid_da43) +begin + + DAL[43] = 1'bx; + BWEBAL[43] = 1'b0; +end + +always @(valid_db43) +begin + disable CLKAOP; + DBL[43] = 1'bx; + BWEBBL[43] = 1'b0; +end + +always @(valid_bwa43) +begin + + DAL[43] = 1'bx; + BWEBAL[43] = 1'b0; +end + +always @(valid_bwb43) +begin + disable CLKAOP; + DBL[43] = 1'bx; + BWEBBL[43] = 1'b0; +end +always @(valid_da44) +begin + + DAL[44] = 1'bx; + BWEBAL[44] = 1'b0; +end + +always @(valid_db44) +begin + disable CLKAOP; + DBL[44] = 1'bx; + BWEBBL[44] = 1'b0; +end + +always @(valid_bwa44) +begin + + DAL[44] = 1'bx; + BWEBAL[44] = 1'b0; +end + +always @(valid_bwb44) +begin + disable CLKAOP; + DBL[44] = 1'bx; + BWEBBL[44] = 1'b0; +end +always @(valid_da45) +begin + + DAL[45] = 1'bx; + BWEBAL[45] = 1'b0; +end + +always @(valid_db45) +begin + disable CLKAOP; + DBL[45] = 1'bx; + BWEBBL[45] = 1'b0; +end + +always @(valid_bwa45) +begin + + DAL[45] = 1'bx; + BWEBAL[45] = 1'b0; +end + +always @(valid_bwb45) +begin + disable CLKAOP; + DBL[45] = 1'bx; + BWEBBL[45] = 1'b0; +end +always @(valid_da46) +begin + + DAL[46] = 1'bx; + BWEBAL[46] = 1'b0; +end + +always @(valid_db46) +begin + disable CLKAOP; + DBL[46] = 1'bx; + BWEBBL[46] = 1'b0; +end + +always @(valid_bwa46) +begin + + DAL[46] = 1'bx; + BWEBAL[46] = 1'b0; +end + +always @(valid_bwb46) +begin + disable CLKAOP; + DBL[46] = 1'bx; + BWEBBL[46] = 1'b0; +end +always @(valid_da47) +begin + + DAL[47] = 1'bx; + BWEBAL[47] = 1'b0; +end + +always @(valid_db47) +begin + disable CLKAOP; + DBL[47] = 1'bx; + BWEBBL[47] = 1'b0; +end + +always @(valid_bwa47) +begin + + DAL[47] = 1'bx; + BWEBAL[47] = 1'b0; +end + +always @(valid_bwb47) +begin + disable CLKAOP; + DBL[47] = 1'bx; + BWEBBL[47] = 1'b0; +end +always @(valid_da48) +begin + + DAL[48] = 1'bx; + BWEBAL[48] = 1'b0; +end + +always @(valid_db48) +begin + disable CLKAOP; + DBL[48] = 1'bx; + BWEBBL[48] = 1'b0; +end + +always @(valid_bwa48) +begin + + DAL[48] = 1'bx; + BWEBAL[48] = 1'b0; +end + +always @(valid_bwb48) +begin + disable CLKAOP; + DBL[48] = 1'bx; + BWEBBL[48] = 1'b0; +end +always @(valid_da49) +begin + + DAL[49] = 1'bx; + BWEBAL[49] = 1'b0; +end + +always @(valid_db49) +begin + disable CLKAOP; + DBL[49] = 1'bx; + BWEBBL[49] = 1'b0; +end + +always @(valid_bwa49) +begin + + DAL[49] = 1'bx; + BWEBAL[49] = 1'b0; +end + +always @(valid_bwb49) +begin + disable CLKAOP; + DBL[49] = 1'bx; + BWEBBL[49] = 1'b0; +end +always @(valid_da50) +begin + + DAL[50] = 1'bx; + BWEBAL[50] = 1'b0; +end + +always @(valid_db50) +begin + disable CLKAOP; + DBL[50] = 1'bx; + BWEBBL[50] = 1'b0; +end + +always @(valid_bwa50) +begin + + DAL[50] = 1'bx; + BWEBAL[50] = 1'b0; +end + +always @(valid_bwb50) +begin + disable CLKAOP; + DBL[50] = 1'bx; + BWEBBL[50] = 1'b0; +end +always @(valid_da51) +begin + + DAL[51] = 1'bx; + BWEBAL[51] = 1'b0; +end + +always @(valid_db51) +begin + disable CLKAOP; + DBL[51] = 1'bx; + BWEBBL[51] = 1'b0; +end + +always @(valid_bwa51) +begin + + DAL[51] = 1'bx; + BWEBAL[51] = 1'b0; +end + +always @(valid_bwb51) +begin + disable CLKAOP; + DBL[51] = 1'bx; + BWEBBL[51] = 1'b0; +end +always @(valid_da52) +begin + + DAL[52] = 1'bx; + BWEBAL[52] = 1'b0; +end + +always @(valid_db52) +begin + disable CLKAOP; + DBL[52] = 1'bx; + BWEBBL[52] = 1'b0; +end + +always @(valid_bwa52) +begin + + DAL[52] = 1'bx; + BWEBAL[52] = 1'b0; +end + +always @(valid_bwb52) +begin + disable CLKAOP; + DBL[52] = 1'bx; + BWEBBL[52] = 1'b0; +end +always @(valid_da53) +begin + + DAL[53] = 1'bx; + BWEBAL[53] = 1'b0; +end + +always @(valid_db53) +begin + disable CLKAOP; + DBL[53] = 1'bx; + BWEBBL[53] = 1'b0; +end + +always @(valid_bwa53) +begin + + DAL[53] = 1'bx; + BWEBAL[53] = 1'b0; +end + +always @(valid_bwb53) +begin + disable CLKAOP; + DBL[53] = 1'bx; + BWEBBL[53] = 1'b0; +end +always @(valid_da54) +begin + + DAL[54] = 1'bx; + BWEBAL[54] = 1'b0; +end + +always @(valid_db54) +begin + disable CLKAOP; + DBL[54] = 1'bx; + BWEBBL[54] = 1'b0; +end + +always @(valid_bwa54) +begin + + DAL[54] = 1'bx; + BWEBAL[54] = 1'b0; +end + +always @(valid_bwb54) +begin + disable CLKAOP; + DBL[54] = 1'bx; + BWEBBL[54] = 1'b0; +end +always @(valid_da55) +begin + + DAL[55] = 1'bx; + BWEBAL[55] = 1'b0; +end + +always @(valid_db55) +begin + disable CLKAOP; + DBL[55] = 1'bx; + BWEBBL[55] = 1'b0; +end + +always @(valid_bwa55) +begin + + DAL[55] = 1'bx; + BWEBAL[55] = 1'b0; +end + +always @(valid_bwb55) +begin + disable CLKAOP; + DBL[55] = 1'bx; + BWEBBL[55] = 1'b0; +end +always @(valid_da56) +begin + + DAL[56] = 1'bx; + BWEBAL[56] = 1'b0; +end + +always @(valid_db56) +begin + disable CLKAOP; + DBL[56] = 1'bx; + BWEBBL[56] = 1'b0; +end + +always @(valid_bwa56) +begin + + DAL[56] = 1'bx; + BWEBAL[56] = 1'b0; +end + +always @(valid_bwb56) +begin + disable CLKAOP; + DBL[56] = 1'bx; + BWEBBL[56] = 1'b0; +end +always @(valid_da57) +begin + + DAL[57] = 1'bx; + BWEBAL[57] = 1'b0; +end + +always @(valid_db57) +begin + disable CLKAOP; + DBL[57] = 1'bx; + BWEBBL[57] = 1'b0; +end + +always @(valid_bwa57) +begin + + DAL[57] = 1'bx; + BWEBAL[57] = 1'b0; +end + +always @(valid_bwb57) +begin + disable CLKAOP; + DBL[57] = 1'bx; + BWEBBL[57] = 1'b0; +end +always @(valid_da58) +begin + + DAL[58] = 1'bx; + BWEBAL[58] = 1'b0; +end + +always @(valid_db58) +begin + disable CLKAOP; + DBL[58] = 1'bx; + BWEBBL[58] = 1'b0; +end + +always @(valid_bwa58) +begin + + DAL[58] = 1'bx; + BWEBAL[58] = 1'b0; +end + +always @(valid_bwb58) +begin + disable CLKAOP; + DBL[58] = 1'bx; + BWEBBL[58] = 1'b0; +end +always @(valid_da59) +begin + + DAL[59] = 1'bx; + BWEBAL[59] = 1'b0; +end + +always @(valid_db59) +begin + disable CLKAOP; + DBL[59] = 1'bx; + BWEBBL[59] = 1'b0; +end + +always @(valid_bwa59) +begin + + DAL[59] = 1'bx; + BWEBAL[59] = 1'b0; +end + +always @(valid_bwb59) +begin + disable CLKAOP; + DBL[59] = 1'bx; + BWEBBL[59] = 1'b0; +end +always @(valid_da60) +begin + + DAL[60] = 1'bx; + BWEBAL[60] = 1'b0; +end + +always @(valid_db60) +begin + disable CLKAOP; + DBL[60] = 1'bx; + BWEBBL[60] = 1'b0; +end + +always @(valid_bwa60) +begin + + DAL[60] = 1'bx; + BWEBAL[60] = 1'b0; +end + +always @(valid_bwb60) +begin + disable CLKAOP; + DBL[60] = 1'bx; + BWEBBL[60] = 1'b0; +end +always @(valid_da61) +begin + + DAL[61] = 1'bx; + BWEBAL[61] = 1'b0; +end + +always @(valid_db61) +begin + disable CLKAOP; + DBL[61] = 1'bx; + BWEBBL[61] = 1'b0; +end + +always @(valid_bwa61) +begin + + DAL[61] = 1'bx; + BWEBAL[61] = 1'b0; +end + +always @(valid_bwb61) +begin + disable CLKAOP; + DBL[61] = 1'bx; + BWEBBL[61] = 1'b0; +end +always @(valid_da62) +begin + + DAL[62] = 1'bx; + BWEBAL[62] = 1'b0; +end + +always @(valid_db62) +begin + disable CLKAOP; + DBL[62] = 1'bx; + BWEBBL[62] = 1'b0; +end + +always @(valid_bwa62) +begin + + DAL[62] = 1'bx; + BWEBAL[62] = 1'b0; +end + +always @(valid_bwb62) +begin + disable CLKAOP; + DBL[62] = 1'bx; + BWEBBL[62] = 1'b0; +end +always @(valid_da63) +begin + + DAL[63] = 1'bx; + BWEBAL[63] = 1'b0; +end + +always @(valid_db63) +begin + disable CLKAOP; + DBL[63] = 1'bx; + BWEBBL[63] = 1'b0; +end + +always @(valid_bwa63) +begin + + DAL[63] = 1'bx; + BWEBAL[63] = 1'b0; +end + +always @(valid_bwb63) +begin + disable CLKAOP; + DBL[63] = 1'bx; + BWEBBL[63] = 1'b0; +end +always @(valid_da64) +begin + + DAL[64] = 1'bx; + BWEBAL[64] = 1'b0; +end + +always @(valid_db64) +begin + disable CLKAOP; + DBL[64] = 1'bx; + BWEBBL[64] = 1'b0; +end + +always @(valid_bwa64) +begin + + DAL[64] = 1'bx; + BWEBAL[64] = 1'b0; +end + +always @(valid_bwb64) +begin + disable CLKAOP; + DBL[64] = 1'bx; + BWEBBL[64] = 1'b0; +end +always @(valid_da65) +begin + + DAL[65] = 1'bx; + BWEBAL[65] = 1'b0; +end + +always @(valid_db65) +begin + disable CLKAOP; + DBL[65] = 1'bx; + BWEBBL[65] = 1'b0; +end + +always @(valid_bwa65) +begin + + DAL[65] = 1'bx; + BWEBAL[65] = 1'b0; +end + +always @(valid_bwb65) +begin + disable CLKAOP; + DBL[65] = 1'bx; + BWEBBL[65] = 1'b0; +end +always @(valid_da66) +begin + + DAL[66] = 1'bx; + BWEBAL[66] = 1'b0; +end + +always @(valid_db66) +begin + disable CLKAOP; + DBL[66] = 1'bx; + BWEBBL[66] = 1'b0; +end + +always @(valid_bwa66) +begin + + DAL[66] = 1'bx; + BWEBAL[66] = 1'b0; +end + +always @(valid_bwb66) +begin + disable CLKAOP; + DBL[66] = 1'bx; + BWEBBL[66] = 1'b0; +end +always @(valid_da67) +begin + + DAL[67] = 1'bx; + BWEBAL[67] = 1'b0; +end + +always @(valid_db67) +begin + disable CLKAOP; + DBL[67] = 1'bx; + BWEBBL[67] = 1'b0; +end + +always @(valid_bwa67) +begin + + DAL[67] = 1'bx; + BWEBAL[67] = 1'b0; +end + +always @(valid_bwb67) +begin + disable CLKAOP; + DBL[67] = 1'bx; + BWEBBL[67] = 1'b0; +end +always @(valid_da68) +begin + + DAL[68] = 1'bx; + BWEBAL[68] = 1'b0; +end + +always @(valid_db68) +begin + disable CLKAOP; + DBL[68] = 1'bx; + BWEBBL[68] = 1'b0; +end + +always @(valid_bwa68) +begin + + DAL[68] = 1'bx; + BWEBAL[68] = 1'b0; +end + +always @(valid_bwb68) +begin + disable CLKAOP; + DBL[68] = 1'bx; + BWEBBL[68] = 1'b0; +end +always @(valid_da69) +begin + + DAL[69] = 1'bx; + BWEBAL[69] = 1'b0; +end + +always @(valid_db69) +begin + disable CLKAOP; + DBL[69] = 1'bx; + BWEBBL[69] = 1'b0; +end + +always @(valid_bwa69) +begin + + DAL[69] = 1'bx; + BWEBAL[69] = 1'b0; +end + +always @(valid_bwb69) +begin + disable CLKAOP; + DBL[69] = 1'bx; + BWEBBL[69] = 1'b0; +end +always @(valid_da70) +begin + + DAL[70] = 1'bx; + BWEBAL[70] = 1'b0; +end + +always @(valid_db70) +begin + disable CLKAOP; + DBL[70] = 1'bx; + BWEBBL[70] = 1'b0; +end + +always @(valid_bwa70) +begin + + DAL[70] = 1'bx; + BWEBAL[70] = 1'b0; +end + +always @(valid_bwb70) +begin + disable CLKAOP; + DBL[70] = 1'bx; + BWEBBL[70] = 1'b0; +end +always @(valid_da71) +begin + + DAL[71] = 1'bx; + BWEBAL[71] = 1'b0; +end + +always @(valid_db71) +begin + disable CLKAOP; + DBL[71] = 1'bx; + BWEBBL[71] = 1'b0; +end + +always @(valid_bwa71) +begin + + DAL[71] = 1'bx; + BWEBAL[71] = 1'b0; +end + +always @(valid_bwb71) +begin + disable CLKAOP; + DBL[71] = 1'bx; + BWEBBL[71] = 1'b0; +end +always @(valid_da72) +begin + + DAL[72] = 1'bx; + BWEBAL[72] = 1'b0; +end + +always @(valid_db72) +begin + disable CLKAOP; + DBL[72] = 1'bx; + BWEBBL[72] = 1'b0; +end + +always @(valid_bwa72) +begin + + DAL[72] = 1'bx; + BWEBAL[72] = 1'b0; +end + +always @(valid_bwb72) +begin + disable CLKAOP; + DBL[72] = 1'bx; + BWEBBL[72] = 1'b0; +end +always @(valid_da73) +begin + + DAL[73] = 1'bx; + BWEBAL[73] = 1'b0; +end + +always @(valid_db73) +begin + disable CLKAOP; + DBL[73] = 1'bx; + BWEBBL[73] = 1'b0; +end + +always @(valid_bwa73) +begin + + DAL[73] = 1'bx; + BWEBAL[73] = 1'b0; +end + +always @(valid_bwb73) +begin + disable CLKAOP; + DBL[73] = 1'bx; + BWEBBL[73] = 1'b0; +end +always @(valid_da74) +begin + + DAL[74] = 1'bx; + BWEBAL[74] = 1'b0; +end + +always @(valid_db74) +begin + disable CLKAOP; + DBL[74] = 1'bx; + BWEBBL[74] = 1'b0; +end + +always @(valid_bwa74) +begin + + DAL[74] = 1'bx; + BWEBAL[74] = 1'b0; +end + +always @(valid_bwb74) +begin + disable CLKAOP; + DBL[74] = 1'bx; + BWEBBL[74] = 1'b0; +end +always @(valid_da75) +begin + + DAL[75] = 1'bx; + BWEBAL[75] = 1'b0; +end + +always @(valid_db75) +begin + disable CLKAOP; + DBL[75] = 1'bx; + BWEBBL[75] = 1'b0; +end + +always @(valid_bwa75) +begin + + DAL[75] = 1'bx; + BWEBAL[75] = 1'b0; +end + +always @(valid_bwb75) +begin + disable CLKAOP; + DBL[75] = 1'bx; + BWEBBL[75] = 1'b0; +end +always @(valid_da76) +begin + + DAL[76] = 1'bx; + BWEBAL[76] = 1'b0; +end + +always @(valid_db76) +begin + disable CLKAOP; + DBL[76] = 1'bx; + BWEBBL[76] = 1'b0; +end + +always @(valid_bwa76) +begin + + DAL[76] = 1'bx; + BWEBAL[76] = 1'b0; +end + +always @(valid_bwb76) +begin + disable CLKAOP; + DBL[76] = 1'bx; + BWEBBL[76] = 1'b0; +end +always @(valid_da77) +begin + + DAL[77] = 1'bx; + BWEBAL[77] = 1'b0; +end + +always @(valid_db77) +begin + disable CLKAOP; + DBL[77] = 1'bx; + BWEBBL[77] = 1'b0; +end + +always @(valid_bwa77) +begin + + DAL[77] = 1'bx; + BWEBAL[77] = 1'b0; +end + +always @(valid_bwb77) +begin + disable CLKAOP; + DBL[77] = 1'bx; + BWEBBL[77] = 1'b0; +end +always @(valid_da78) +begin + + DAL[78] = 1'bx; + BWEBAL[78] = 1'b0; +end + +always @(valid_db78) +begin + disable CLKAOP; + DBL[78] = 1'bx; + BWEBBL[78] = 1'b0; +end + +always @(valid_bwa78) +begin + + DAL[78] = 1'bx; + BWEBAL[78] = 1'b0; +end + +always @(valid_bwb78) +begin + disable CLKAOP; + DBL[78] = 1'bx; + BWEBBL[78] = 1'b0; +end +always @(valid_da79) +begin + + DAL[79] = 1'bx; + BWEBAL[79] = 1'b0; +end + +always @(valid_db79) +begin + disable CLKAOP; + DBL[79] = 1'bx; + BWEBBL[79] = 1'b0; +end + +always @(valid_bwa79) +begin + + DAL[79] = 1'bx; + BWEBAL[79] = 1'b0; +end + +always @(valid_bwb79) +begin + disable CLKAOP; + DBL[79] = 1'bx; + BWEBBL[79] = 1'b0; +end +always @(valid_da80) +begin + + DAL[80] = 1'bx; + BWEBAL[80] = 1'b0; +end + +always @(valid_db80) +begin + disable CLKAOP; + DBL[80] = 1'bx; + BWEBBL[80] = 1'b0; +end + +always @(valid_bwa80) +begin + + DAL[80] = 1'bx; + BWEBAL[80] = 1'b0; +end + +always @(valid_bwb80) +begin + disable CLKAOP; + DBL[80] = 1'bx; + BWEBBL[80] = 1'b0; +end +always @(valid_da81) +begin + + DAL[81] = 1'bx; + BWEBAL[81] = 1'b0; +end + +always @(valid_db81) +begin + disable CLKAOP; + DBL[81] = 1'bx; + BWEBBL[81] = 1'b0; +end + +always @(valid_bwa81) +begin + + DAL[81] = 1'bx; + BWEBAL[81] = 1'b0; +end + +always @(valid_bwb81) +begin + disable CLKAOP; + DBL[81] = 1'bx; + BWEBBL[81] = 1'b0; +end +always @(valid_da82) +begin + + DAL[82] = 1'bx; + BWEBAL[82] = 1'b0; +end + +always @(valid_db82) +begin + disable CLKAOP; + DBL[82] = 1'bx; + BWEBBL[82] = 1'b0; +end + +always @(valid_bwa82) +begin + + DAL[82] = 1'bx; + BWEBAL[82] = 1'b0; +end + +always @(valid_bwb82) +begin + disable CLKAOP; + DBL[82] = 1'bx; + BWEBBL[82] = 1'b0; +end +always @(valid_da83) +begin + + DAL[83] = 1'bx; + BWEBAL[83] = 1'b0; +end + +always @(valid_db83) +begin + disable CLKAOP; + DBL[83] = 1'bx; + BWEBBL[83] = 1'b0; +end + +always @(valid_bwa83) +begin + + DAL[83] = 1'bx; + BWEBAL[83] = 1'b0; +end + +always @(valid_bwb83) +begin + disable CLKAOP; + DBL[83] = 1'bx; + BWEBBL[83] = 1'b0; +end +always @(valid_da84) +begin + + DAL[84] = 1'bx; + BWEBAL[84] = 1'b0; +end + +always @(valid_db84) +begin + disable CLKAOP; + DBL[84] = 1'bx; + BWEBBL[84] = 1'b0; +end + +always @(valid_bwa84) +begin + + DAL[84] = 1'bx; + BWEBAL[84] = 1'b0; +end + +always @(valid_bwb84) +begin + disable CLKAOP; + DBL[84] = 1'bx; + BWEBBL[84] = 1'b0; +end +always @(valid_da85) +begin + + DAL[85] = 1'bx; + BWEBAL[85] = 1'b0; +end + +always @(valid_db85) +begin + disable CLKAOP; + DBL[85] = 1'bx; + BWEBBL[85] = 1'b0; +end + +always @(valid_bwa85) +begin + + DAL[85] = 1'bx; + BWEBAL[85] = 1'b0; +end + +always @(valid_bwb85) +begin + disable CLKAOP; + DBL[85] = 1'bx; + BWEBBL[85] = 1'b0; +end +always @(valid_da86) +begin + + DAL[86] = 1'bx; + BWEBAL[86] = 1'b0; +end + +always @(valid_db86) +begin + disable CLKAOP; + DBL[86] = 1'bx; + BWEBBL[86] = 1'b0; +end + +always @(valid_bwa86) +begin + + DAL[86] = 1'bx; + BWEBAL[86] = 1'b0; +end + +always @(valid_bwb86) +begin + disable CLKAOP; + DBL[86] = 1'bx; + BWEBBL[86] = 1'b0; +end +always @(valid_da87) +begin + + DAL[87] = 1'bx; + BWEBAL[87] = 1'b0; +end + +always @(valid_db87) +begin + disable CLKAOP; + DBL[87] = 1'bx; + BWEBBL[87] = 1'b0; +end + +always @(valid_bwa87) +begin + + DAL[87] = 1'bx; + BWEBAL[87] = 1'b0; +end + +always @(valid_bwb87) +begin + disable CLKAOP; + DBL[87] = 1'bx; + BWEBBL[87] = 1'b0; +end +always @(valid_da88) +begin + + DAL[88] = 1'bx; + BWEBAL[88] = 1'b0; +end + +always @(valid_db88) +begin + disable CLKAOP; + DBL[88] = 1'bx; + BWEBBL[88] = 1'b0; +end + +always @(valid_bwa88) +begin + + DAL[88] = 1'bx; + BWEBAL[88] = 1'b0; +end + +always @(valid_bwb88) +begin + disable CLKAOP; + DBL[88] = 1'bx; + BWEBBL[88] = 1'b0; +end +always @(valid_da89) +begin + + DAL[89] = 1'bx; + BWEBAL[89] = 1'b0; +end + +always @(valid_db89) +begin + disable CLKAOP; + DBL[89] = 1'bx; + BWEBBL[89] = 1'b0; +end + +always @(valid_bwa89) +begin + + DAL[89] = 1'bx; + BWEBAL[89] = 1'b0; +end + +always @(valid_bwb89) +begin + disable CLKAOP; + DBL[89] = 1'bx; + BWEBBL[89] = 1'b0; +end +always @(valid_da90) +begin + + DAL[90] = 1'bx; + BWEBAL[90] = 1'b0; +end + +always @(valid_db90) +begin + disable CLKAOP; + DBL[90] = 1'bx; + BWEBBL[90] = 1'b0; +end + +always @(valid_bwa90) +begin + + DAL[90] = 1'bx; + BWEBAL[90] = 1'b0; +end + +always @(valid_bwb90) +begin + disable CLKAOP; + DBL[90] = 1'bx; + BWEBBL[90] = 1'b0; +end +always @(valid_da91) +begin + + DAL[91] = 1'bx; + BWEBAL[91] = 1'b0; +end + +always @(valid_db91) +begin + disable CLKAOP; + DBL[91] = 1'bx; + BWEBBL[91] = 1'b0; +end + +always @(valid_bwa91) +begin + + DAL[91] = 1'bx; + BWEBAL[91] = 1'b0; +end + +always @(valid_bwb91) +begin + disable CLKAOP; + DBL[91] = 1'bx; + BWEBBL[91] = 1'b0; +end +always @(valid_da92) +begin + + DAL[92] = 1'bx; + BWEBAL[92] = 1'b0; +end + +always @(valid_db92) +begin + disable CLKAOP; + DBL[92] = 1'bx; + BWEBBL[92] = 1'b0; +end + +always @(valid_bwa92) +begin + + DAL[92] = 1'bx; + BWEBAL[92] = 1'b0; +end + +always @(valid_bwb92) +begin + disable CLKAOP; + DBL[92] = 1'bx; + BWEBBL[92] = 1'b0; +end +always @(valid_da93) +begin + + DAL[93] = 1'bx; + BWEBAL[93] = 1'b0; +end + +always @(valid_db93) +begin + disable CLKAOP; + DBL[93] = 1'bx; + BWEBBL[93] = 1'b0; +end + +always @(valid_bwa93) +begin + + DAL[93] = 1'bx; + BWEBAL[93] = 1'b0; +end + +always @(valid_bwb93) +begin + disable CLKAOP; + DBL[93] = 1'bx; + BWEBBL[93] = 1'b0; +end +always @(valid_da94) +begin + + DAL[94] = 1'bx; + BWEBAL[94] = 1'b0; +end + +always @(valid_db94) +begin + disable CLKAOP; + DBL[94] = 1'bx; + BWEBBL[94] = 1'b0; +end + +always @(valid_bwa94) +begin + + DAL[94] = 1'bx; + BWEBAL[94] = 1'b0; +end + +always @(valid_bwb94) +begin + disable CLKAOP; + DBL[94] = 1'bx; + BWEBBL[94] = 1'b0; +end +always @(valid_da95) +begin + + DAL[95] = 1'bx; + BWEBAL[95] = 1'b0; +end + +always @(valid_db95) +begin + disable CLKAOP; + DBL[95] = 1'bx; + BWEBBL[95] = 1'b0; +end + +always @(valid_bwa95) +begin + + DAL[95] = 1'bx; + BWEBAL[95] = 1'b0; +end + +always @(valid_bwb95) +begin + disable CLKAOP; + DBL[95] = 1'bx; + BWEBBL[95] = 1'b0; +end +always @(valid_da96) +begin + + DAL[96] = 1'bx; + BWEBAL[96] = 1'b0; +end + +always @(valid_db96) +begin + disable CLKAOP; + DBL[96] = 1'bx; + BWEBBL[96] = 1'b0; +end + +always @(valid_bwa96) +begin + + DAL[96] = 1'bx; + BWEBAL[96] = 1'b0; +end + +always @(valid_bwb96) +begin + disable CLKAOP; + DBL[96] = 1'bx; + BWEBBL[96] = 1'b0; +end +always @(valid_da97) +begin + + DAL[97] = 1'bx; + BWEBAL[97] = 1'b0; +end + +always @(valid_db97) +begin + disable CLKAOP; + DBL[97] = 1'bx; + BWEBBL[97] = 1'b0; +end + +always @(valid_bwa97) +begin + + DAL[97] = 1'bx; + BWEBAL[97] = 1'b0; +end + +always @(valid_bwb97) +begin + disable CLKAOP; + DBL[97] = 1'bx; + BWEBBL[97] = 1'b0; +end +always @(valid_da98) +begin + + DAL[98] = 1'bx; + BWEBAL[98] = 1'b0; +end + +always @(valid_db98) +begin + disable CLKAOP; + DBL[98] = 1'bx; + BWEBBL[98] = 1'b0; +end + +always @(valid_bwa98) +begin + + DAL[98] = 1'bx; + BWEBAL[98] = 1'b0; +end + +always @(valid_bwb98) +begin + disable CLKAOP; + DBL[98] = 1'bx; + BWEBBL[98] = 1'b0; +end +always @(valid_da99) +begin + + DAL[99] = 1'bx; + BWEBAL[99] = 1'b0; +end + +always @(valid_db99) +begin + disable CLKAOP; + DBL[99] = 1'bx; + BWEBBL[99] = 1'b0; +end + +always @(valid_bwa99) +begin + + DAL[99] = 1'bx; + BWEBAL[99] = 1'b0; +end + +always @(valid_bwb99) +begin + disable CLKAOP; + DBL[99] = 1'bx; + BWEBBL[99] = 1'b0; +end +always @(valid_da100) +begin + + DAL[100] = 1'bx; + BWEBAL[100] = 1'b0; +end + +always @(valid_db100) +begin + disable CLKAOP; + DBL[100] = 1'bx; + BWEBBL[100] = 1'b0; +end + +always @(valid_bwa100) +begin + + DAL[100] = 1'bx; + BWEBAL[100] = 1'b0; +end + +always @(valid_bwb100) +begin + disable CLKAOP; + DBL[100] = 1'bx; + BWEBBL[100] = 1'b0; +end +always @(valid_da101) +begin + + DAL[101] = 1'bx; + BWEBAL[101] = 1'b0; +end + +always @(valid_db101) +begin + disable CLKAOP; + DBL[101] = 1'bx; + BWEBBL[101] = 1'b0; +end + +always @(valid_bwa101) +begin + + DAL[101] = 1'bx; + BWEBAL[101] = 1'b0; +end + +always @(valid_bwb101) +begin + disable CLKAOP; + DBL[101] = 1'bx; + BWEBBL[101] = 1'b0; +end +always @(valid_da102) +begin + + DAL[102] = 1'bx; + BWEBAL[102] = 1'b0; +end + +always @(valid_db102) +begin + disable CLKAOP; + DBL[102] = 1'bx; + BWEBBL[102] = 1'b0; +end + +always @(valid_bwa102) +begin + + DAL[102] = 1'bx; + BWEBAL[102] = 1'b0; +end + +always @(valid_bwb102) +begin + disable CLKAOP; + DBL[102] = 1'bx; + BWEBBL[102] = 1'b0; +end +always @(valid_da103) +begin + + DAL[103] = 1'bx; + BWEBAL[103] = 1'b0; +end + +always @(valid_db103) +begin + disable CLKAOP; + DBL[103] = 1'bx; + BWEBBL[103] = 1'b0; +end + +always @(valid_bwa103) +begin + + DAL[103] = 1'bx; + BWEBAL[103] = 1'b0; +end + +always @(valid_bwb103) +begin + disable CLKAOP; + DBL[103] = 1'bx; + BWEBBL[103] = 1'b0; +end +always @(valid_da104) +begin + + DAL[104] = 1'bx; + BWEBAL[104] = 1'b0; +end + +always @(valid_db104) +begin + disable CLKAOP; + DBL[104] = 1'bx; + BWEBBL[104] = 1'b0; +end + +always @(valid_bwa104) +begin + + DAL[104] = 1'bx; + BWEBAL[104] = 1'b0; +end + +always @(valid_bwb104) +begin + disable CLKAOP; + DBL[104] = 1'bx; + BWEBBL[104] = 1'b0; +end +always @(valid_da105) +begin + + DAL[105] = 1'bx; + BWEBAL[105] = 1'b0; +end + +always @(valid_db105) +begin + disable CLKAOP; + DBL[105] = 1'bx; + BWEBBL[105] = 1'b0; +end + +always @(valid_bwa105) +begin + + DAL[105] = 1'bx; + BWEBAL[105] = 1'b0; +end + +always @(valid_bwb105) +begin + disable CLKAOP; + DBL[105] = 1'bx; + BWEBBL[105] = 1'b0; +end +always @(valid_da106) +begin + + DAL[106] = 1'bx; + BWEBAL[106] = 1'b0; +end + +always @(valid_db106) +begin + disable CLKAOP; + DBL[106] = 1'bx; + BWEBBL[106] = 1'b0; +end + +always @(valid_bwa106) +begin + + DAL[106] = 1'bx; + BWEBAL[106] = 1'b0; +end + +always @(valid_bwb106) +begin + disable CLKAOP; + DBL[106] = 1'bx; + BWEBBL[106] = 1'b0; +end +always @(valid_da107) +begin + + DAL[107] = 1'bx; + BWEBAL[107] = 1'b0; +end + +always @(valid_db107) +begin + disable CLKAOP; + DBL[107] = 1'bx; + BWEBBL[107] = 1'b0; +end + +always @(valid_bwa107) +begin + + DAL[107] = 1'bx; + BWEBAL[107] = 1'b0; +end + +always @(valid_bwb107) +begin + disable CLKAOP; + DBL[107] = 1'bx; + BWEBBL[107] = 1'b0; +end +always @(valid_da108) +begin + + DAL[108] = 1'bx; + BWEBAL[108] = 1'b0; +end + +always @(valid_db108) +begin + disable CLKAOP; + DBL[108] = 1'bx; + BWEBBL[108] = 1'b0; +end + +always @(valid_bwa108) +begin + + DAL[108] = 1'bx; + BWEBAL[108] = 1'b0; +end + +always @(valid_bwb108) +begin + disable CLKAOP; + DBL[108] = 1'bx; + BWEBBL[108] = 1'b0; +end +always @(valid_da109) +begin + + DAL[109] = 1'bx; + BWEBAL[109] = 1'b0; +end + +always @(valid_db109) +begin + disable CLKAOP; + DBL[109] = 1'bx; + BWEBBL[109] = 1'b0; +end + +always @(valid_bwa109) +begin + + DAL[109] = 1'bx; + BWEBAL[109] = 1'b0; +end + +always @(valid_bwb109) +begin + disable CLKAOP; + DBL[109] = 1'bx; + BWEBBL[109] = 1'b0; +end +always @(valid_da110) +begin + + DAL[110] = 1'bx; + BWEBAL[110] = 1'b0; +end + +always @(valid_db110) +begin + disable CLKAOP; + DBL[110] = 1'bx; + BWEBBL[110] = 1'b0; +end + +always @(valid_bwa110) +begin + + DAL[110] = 1'bx; + BWEBAL[110] = 1'b0; +end + +always @(valid_bwb110) +begin + disable CLKAOP; + DBL[110] = 1'bx; + BWEBBL[110] = 1'b0; +end +always @(valid_da111) +begin + + DAL[111] = 1'bx; + BWEBAL[111] = 1'b0; +end + +always @(valid_db111) +begin + disable CLKAOP; + DBL[111] = 1'bx; + BWEBBL[111] = 1'b0; +end + +always @(valid_bwa111) +begin + + DAL[111] = 1'bx; + BWEBAL[111] = 1'b0; +end + +always @(valid_bwb111) +begin + disable CLKAOP; + DBL[111] = 1'bx; + BWEBBL[111] = 1'b0; +end +always @(valid_da112) +begin + + DAL[112] = 1'bx; + BWEBAL[112] = 1'b0; +end + +always @(valid_db112) +begin + disable CLKAOP; + DBL[112] = 1'bx; + BWEBBL[112] = 1'b0; +end + +always @(valid_bwa112) +begin + + DAL[112] = 1'bx; + BWEBAL[112] = 1'b0; +end + +always @(valid_bwb112) +begin + disable CLKAOP; + DBL[112] = 1'bx; + BWEBBL[112] = 1'b0; +end +always @(valid_da113) +begin + + DAL[113] = 1'bx; + BWEBAL[113] = 1'b0; +end + +always @(valid_db113) +begin + disable CLKAOP; + DBL[113] = 1'bx; + BWEBBL[113] = 1'b0; +end + +always @(valid_bwa113) +begin + + DAL[113] = 1'bx; + BWEBAL[113] = 1'b0; +end + +always @(valid_bwb113) +begin + disable CLKAOP; + DBL[113] = 1'bx; + BWEBBL[113] = 1'b0; +end +always @(valid_da114) +begin + + DAL[114] = 1'bx; + BWEBAL[114] = 1'b0; +end + +always @(valid_db114) +begin + disable CLKAOP; + DBL[114] = 1'bx; + BWEBBL[114] = 1'b0; +end + +always @(valid_bwa114) +begin + + DAL[114] = 1'bx; + BWEBAL[114] = 1'b0; +end + +always @(valid_bwb114) +begin + disable CLKAOP; + DBL[114] = 1'bx; + BWEBBL[114] = 1'b0; +end +always @(valid_da115) +begin + + DAL[115] = 1'bx; + BWEBAL[115] = 1'b0; +end + +always @(valid_db115) +begin + disable CLKAOP; + DBL[115] = 1'bx; + BWEBBL[115] = 1'b0; +end + +always @(valid_bwa115) +begin + + DAL[115] = 1'bx; + BWEBAL[115] = 1'b0; +end + +always @(valid_bwb115) +begin + disable CLKAOP; + DBL[115] = 1'bx; + BWEBBL[115] = 1'b0; +end +always @(valid_da116) +begin + + DAL[116] = 1'bx; + BWEBAL[116] = 1'b0; +end + +always @(valid_db116) +begin + disable CLKAOP; + DBL[116] = 1'bx; + BWEBBL[116] = 1'b0; +end + +always @(valid_bwa116) +begin + + DAL[116] = 1'bx; + BWEBAL[116] = 1'b0; +end + +always @(valid_bwb116) +begin + disable CLKAOP; + DBL[116] = 1'bx; + BWEBBL[116] = 1'b0; +end +always @(valid_da117) +begin + + DAL[117] = 1'bx; + BWEBAL[117] = 1'b0; +end + +always @(valid_db117) +begin + disable CLKAOP; + DBL[117] = 1'bx; + BWEBBL[117] = 1'b0; +end + +always @(valid_bwa117) +begin + + DAL[117] = 1'bx; + BWEBAL[117] = 1'b0; +end + +always @(valid_bwb117) +begin + disable CLKAOP; + DBL[117] = 1'bx; + BWEBBL[117] = 1'b0; +end +always @(valid_da118) +begin + + DAL[118] = 1'bx; + BWEBAL[118] = 1'b0; +end + +always @(valid_db118) +begin + disable CLKAOP; + DBL[118] = 1'bx; + BWEBBL[118] = 1'b0; +end + +always @(valid_bwa118) +begin + + DAL[118] = 1'bx; + BWEBAL[118] = 1'b0; +end + +always @(valid_bwb118) +begin + disable CLKAOP; + DBL[118] = 1'bx; + BWEBBL[118] = 1'b0; +end +always @(valid_da119) +begin + + DAL[119] = 1'bx; + BWEBAL[119] = 1'b0; +end + +always @(valid_db119) +begin + disable CLKAOP; + DBL[119] = 1'bx; + BWEBBL[119] = 1'b0; +end + +always @(valid_bwa119) +begin + + DAL[119] = 1'bx; + BWEBAL[119] = 1'b0; +end + +always @(valid_bwb119) +begin + disable CLKAOP; + DBL[119] = 1'bx; + BWEBBL[119] = 1'b0; +end +always @(valid_da120) +begin + + DAL[120] = 1'bx; + BWEBAL[120] = 1'b0; +end + +always @(valid_db120) +begin + disable CLKAOP; + DBL[120] = 1'bx; + BWEBBL[120] = 1'b0; +end + +always @(valid_bwa120) +begin + + DAL[120] = 1'bx; + BWEBAL[120] = 1'b0; +end + +always @(valid_bwb120) +begin + disable CLKAOP; + DBL[120] = 1'bx; + BWEBBL[120] = 1'b0; +end +always @(valid_da121) +begin + + DAL[121] = 1'bx; + BWEBAL[121] = 1'b0; +end + +always @(valid_db121) +begin + disable CLKAOP; + DBL[121] = 1'bx; + BWEBBL[121] = 1'b0; +end + +always @(valid_bwa121) +begin + + DAL[121] = 1'bx; + BWEBAL[121] = 1'b0; +end + +always @(valid_bwb121) +begin + disable CLKAOP; + DBL[121] = 1'bx; + BWEBBL[121] = 1'b0; +end +always @(valid_da122) +begin + + DAL[122] = 1'bx; + BWEBAL[122] = 1'b0; +end + +always @(valid_db122) +begin + disable CLKAOP; + DBL[122] = 1'bx; + BWEBBL[122] = 1'b0; +end + +always @(valid_bwa122) +begin + + DAL[122] = 1'bx; + BWEBAL[122] = 1'b0; +end + +always @(valid_bwb122) +begin + disable CLKAOP; + DBL[122] = 1'bx; + BWEBBL[122] = 1'b0; +end +always @(valid_da123) +begin + + DAL[123] = 1'bx; + BWEBAL[123] = 1'b0; +end + +always @(valid_db123) +begin + disable CLKAOP; + DBL[123] = 1'bx; + BWEBBL[123] = 1'b0; +end + +always @(valid_bwa123) +begin + + DAL[123] = 1'bx; + BWEBAL[123] = 1'b0; +end + +always @(valid_bwb123) +begin + disable CLKAOP; + DBL[123] = 1'bx; + BWEBBL[123] = 1'b0; +end +always @(valid_da124) +begin + + DAL[124] = 1'bx; + BWEBAL[124] = 1'b0; +end + +always @(valid_db124) +begin + disable CLKAOP; + DBL[124] = 1'bx; + BWEBBL[124] = 1'b0; +end + +always @(valid_bwa124) +begin + + DAL[124] = 1'bx; + BWEBAL[124] = 1'b0; +end + +always @(valid_bwb124) +begin + disable CLKAOP; + DBL[124] = 1'bx; + BWEBBL[124] = 1'b0; +end +always @(valid_da125) +begin + + DAL[125] = 1'bx; + BWEBAL[125] = 1'b0; +end + +always @(valid_db125) +begin + disable CLKAOP; + DBL[125] = 1'bx; + BWEBBL[125] = 1'b0; +end + +always @(valid_bwa125) +begin + + DAL[125] = 1'bx; + BWEBAL[125] = 1'b0; +end + +always @(valid_bwb125) +begin + disable CLKAOP; + DBL[125] = 1'bx; + BWEBBL[125] = 1'b0; +end +always @(valid_da126) +begin + + DAL[126] = 1'bx; + BWEBAL[126] = 1'b0; +end + +always @(valid_db126) +begin + disable CLKAOP; + DBL[126] = 1'bx; + BWEBBL[126] = 1'b0; +end + +always @(valid_bwa126) +begin + + DAL[126] = 1'bx; + BWEBAL[126] = 1'b0; +end + +always @(valid_bwb126) +begin + disable CLKAOP; + DBL[126] = 1'bx; + BWEBBL[126] = 1'b0; +end +always @(valid_da127) +begin + + DAL[127] = 1'bx; + BWEBAL[127] = 1'b0; +end + +always @(valid_db127) +begin + disable CLKAOP; + DBL[127] = 1'bx; + BWEBBL[127] = 1'b0; +end + +always @(valid_bwa127) +begin + + DAL[127] = 1'bx; + BWEBAL[127] = 1'b0; +end + +always @(valid_bwb127) +begin + disable CLKAOP; + DBL[127] = 1'bx; + BWEBBL[127] = 1'b0; +end + +always @(valid_cea) +begin + + #0.002; + BWEBAL = {N{1'b0}}; + AAL = {M{1'bx}}; + bQA = #0.01 {N{1'bx}}; +end + +always @(valid_ceb) +begin + + #0.002; + BWEBBL = {N{1'b0}}; + ABL = {M{1'bx}}; + bQB = #0.01 {N{1'bx}}; +end + +always @(valid_wea) +begin + #0.002; + BWEBAL = {N{1'b0}}; + AAL = {M{1'bx}}; + bQA = #0.01 {N{1'bx}}; +end + +always @(valid_web) +begin + #0.002; + BWEBBL = {N{1'b0}}; + ABL = {M{1'bx}}; + bQB = #0.01 {N{1'bx}}; +end + +`endif + +// Task for printing the memory between specified addresses.. +task printMemoryFromTo; + input [M - 1:0] from; // memory content are printed, start from this address. + input [M - 1:0] to; // memory content are printed, end at this address. + begin + MX.printMemoryFromTo(from, to); + end +endtask + +// Task for printing entire memory, including normal array and redundancy array. +task printMemory; + begin + MX.printMemory; + end +endtask + +task xMemoryAll; + begin + MX.xMemoryAll; + end +endtask + +task zeroMemoryAll; + begin + MX.zeroMemoryAll; + end +endtask + +// Task for Loading a perdefined set of data from an external file. +task preloadData; + input [256*8:1] infile; // Max 256 character File Name + begin + MX.preloadData(infile); + end +endtask + +tsdn28hpcpuhdb4096x128m4mw_170a_Int_Array #(2,2,W,N,M,MES_ALL) MX (.D({DAL,DBL}),.BW({BWEBAL,BWEBBL}), + .AW({AAL,ABL}),.EN(EN),.AAR(AAL),.ABR(ABL),.RDA(RDA),.RDB(RDB),.QA(QAL),.QB(QBL)); + +endmodule + + `disable_portfaults + `nosuppress_faults + `endcelldefine + + /* + The module ports are parameterizable vectors. + */ + module tsdn28hpcpuhdb4096x128m4mw_170a_Int_Array (D, BW, AW, EN, AAR, ABR, RDA, RDB, QA, QB); + parameter Nread = 2; // Number of Read Ports + parameter Nwrite = 2; // Number of Write Ports + parameter Nword = 2; // Number of Words + parameter Ndata = 1; // Number of Data Bits / Word + parameter Naddr = 1; // Number of Address Bits / Word + parameter MES_ALL = "ON"; + parameter dly = 0.000; + // Cannot define inputs/outputs as memories + input [Ndata*Nwrite-1:0] D; // Data Word(s) + input [Ndata*Nwrite-1:0] BW; // Negative Bit Write Enable + input [Naddr*Nwrite-1:0] AW; // Write Address(es) + input EN; // Positive Write Enable + input RDA; // Positive Write Enable + input RDB; // Positive Write Enable + input [Naddr-1:0] AAR; // Read Address(es) + input [Naddr-1:0] ABR; // Read Address(es) + output [Ndata-1:0] QA; // Output Data Word(s) + output [Ndata-1:0] QB; // Output Data Word(s) + reg [Ndata-1:0] QA; + reg [Ndata-1:0] QB; + reg [Ndata-1:0] mem [Nword-1:0]; + reg [Ndata-1:0] mem_fault [Nword-1:0]; + reg chgmem; // Toggled when write to mem + reg [Nwrite-1:0] wwe; // Positive Word Write Enable for each Port + reg we; // Positive Write Enable for all Ports + integer waddr[Nwrite-1:0]; // Write Address for each Enabled Port + integer address; // Current address + reg [Naddr-1:0] abuf; // Address of current port + reg [Ndata-1:0] dbuf; // Data for current port + reg [Naddr-1:0] abuf_ra; // Address of current port + reg [Ndata-1:0] dbuf_ra; // Data for current port + reg [Naddr-1:0] abuf_rb; // Address of current port + reg [Ndata-1:0] dbuf_rb; // Data for current port + reg [Ndata-1:0] bwbuf; // Bit Write enable for current port + reg dup; // Is the address a duplicate? + integer log; // Log file descriptor + integer ip, ip2, ib, iba_r, ibb_r, iw, iwb, i; // Vector indices + + + initial + begin + if(log[0] === 1'bx) + log = 1; + chgmem = 1'b0; + end + + + always @(D or BW or AW or EN) + begin: WRITE //{ + if(EN !== 1'b0) + begin //{ Possible write + we = 1'b0; + // Mark any write enabled ports & get write addresses + for (ip = 0 ; ip < Nwrite ; ip = ip + 1) + begin //{ + ib = ip * Ndata; + iw = ib + Ndata; + while (ib < iw && BW[ib] === 1'b1) + begin + ib = ib + 1; + end + if(ib == iw) + begin + wwe[ip] = 1'b0; + end + else + begin //{ ip write enabled + iw = ip * Naddr; + for (ib = 0 ; ib < Naddr ; ib = ib + 1) + begin //{ + abuf[ib] = AW[iw+ib]; + if(abuf[ib] !== 1'b0 && abuf[ib] !== 1'b1) + begin + ib = Naddr; + end + end //} + if(ib == Naddr) + begin //{ + if(abuf < Nword) + begin //{ Valid address + waddr[ip] = abuf; + wwe[ip] = 1'b1; + if(we == 1'b0) + begin + chgmem = ~chgmem; + we = EN; + end + end //} + else + begin //{ Out of range address + wwe[ip] = 1'b0; + if( MES_ALL=="ON" && $realtime != 0) + $fdisplay (log, + "\nWarning! Int_Array instance, %m:", + "\n\t Port %0d", ip, + " write address x'%0h'", abuf, + " out of range at time %t.", $realtime, + "\n\t Port %0d data not written to memory.", ip); + end //} + end //} + else + begin //{ unknown write address + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + begin + dbuf[ib] = 1'bx; + end + for (iw = 0 ; iw < Nword ; iw = iw + 1) + begin + mem[iw] = dbuf; + end + chgmem = ~chgmem; + disable WRITE; + end //} + end //} ip write enabled + end //} for ip + if(we === 1'b1) + begin //{ active write enable + for (ip = 0 ; ip < Nwrite ; ip = ip + 1) + begin //{ + if(wwe[ip]) + begin //{ write enabled bits of write port ip + address = waddr[ip]; + dbuf = mem[address]; + iw = ip * Ndata; + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + begin //{ + iwb = iw + ib; + if(BW[iwb] === 1'b0) + begin + dbuf[ib] = D[iwb]; + end + else + if(BW[iwb] !== 1'b1) + begin + dbuf[ib] = 1'bx; + end + end //} + // Check other ports for same address & + // common write enable bits active + dup = 0; + for (ip2 = ip + 1 ; ip2 < Nwrite ; ip2 = ip2 + 1) + begin //{ + if(wwe[ip2] && address == waddr[ip2]) + begin //{ + // initialize bwbuf if first dup + if(!dup) + begin + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + begin + bwbuf[ib] = BW[iw+ib]; + end + dup = 1; + end + iw = ip2 * Ndata; + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + begin //{ + iwb = iw + ib; + // New: Always set X if BW X + if(BW[iwb] === 1'b0) + begin //{ + if(bwbuf[ib] !== 1'b1) + begin + if(D[iwb] !== dbuf[ib]) + begin + dbuf[ib] = 1'bx; + end + end + else + begin + dbuf[ib] = D[iwb]; + bwbuf[ib] = 1'b0; + end + end //} + else if(BW[iwb] !== 1'b1) + begin + dbuf[ib] = 1'bx; + bwbuf[ib] = 1'bx; + end + end //} for each bit + wwe[ip2] = 1'b0; + end //} Port ip2 address matches port ip + end //} for each port beyond ip (ip2=ip+1) + // Write dbuf to memory + mem[address] = dbuf; + end //} wwe[ip] - write port ip enabled + end //} for each write port ip + end //} active write enable + else if(we !== 1'b0) + begin //{ unknown write enable + for (ip = 0 ; ip < Nwrite ; ip = ip + 1) + begin //{ + if(wwe[ip]) + begin //{ write X to enabled bits of write port ip + address = waddr[ip]; + dbuf = mem[address]; + iw = ip * Ndata; + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + begin //{ + if(BW[iw+ib] !== 1'b1) + begin + dbuf[ib] = 1'bx; + end + end //} + mem[address] = dbuf; + if( MES_ALL=="ON" && $realtime != 0) + $fdisplay (log, + "\nWarning! Int_Array instance, %m:", + "\n\t Enable pin unknown at time %t.", $realtime, + "\n\t Enabled bits at port %0d", ip, + " write address x'%0h' set unknown.", address); + end //} wwe[ip] - write port ip enabled + end //} for each write port ip + end //} unknown write enable + end //} possible write (EN != 0) + end //} always @(D or BW or AW or EN) + + + // Read memory + always @(AAR or RDA) + begin //{ + for (iba_r = 0 ; iba_r < Naddr ; iba_r = iba_r + 1) + begin + abuf_ra[iba_r] = AAR[iba_r]; + if(abuf_ra[iba_r] !== 0 && abuf_ra[iba_r] !== 1) + begin + iba_r = Naddr; + end + end + if(iba_r == Naddr && abuf_ra < Nword) + begin //{ Read valid address + `ifdef TSMC_INITIALIZE_FAULT + dbuf_ra = mem[abuf_ra] ^ mem_fault[abuf_ra]; + `else + dbuf_ra = mem[abuf_ra]; + `endif + for (iba_r = 0 ; iba_r < Ndata ; iba_r = iba_r + 1) + begin + if(QA[iba_r] == dbuf_ra[iba_r]) + begin + QA[iba_r] <= #(dly) dbuf_ra[iba_r]; + end + else + begin + QA[iba_r] <= #(dly) dbuf_ra[iba_r]; + end // else + end // for + end //} valid address + else + begin //{ Invalid address + if(iba_r <= Naddr) begin + if( MES_ALL=="ON" && $realtime != 0) + $fwrite (log, "\nWarning! Int_Array instance, %m:", + "\n\t Port A read address"); + if( MES_ALL=="ON" && $realtime != 0) + $fwrite (log, " x'%0h' out of range", abuf_ra); + if( MES_ALL=="ON" && $realtime != 0) + $fdisplay (log, + " at time %t.", $realtime, + "\n\t Port A outputs set to unknown."); + end + + for (iba_r = 0 ; iba_r < Ndata ; iba_r = iba_r + 1) + QA[iba_r] <= #(dly) 1'bx; + end //} invalid address + end //} always @(chgmem or AR) + + // Read memory + always @(ABR or RDB) + begin //{ + for (ibb_r = 0 ; ibb_r < Naddr ; ibb_r = ibb_r + 1) + begin + abuf_rb[ibb_r] = ABR[ibb_r]; + if(abuf_rb[ibb_r] !== 0 && abuf_rb[ibb_r] !== 1) + begin + ibb_r = Naddr; + end + end + if(ibb_r == Naddr && abuf_rb < Nword) + begin //{ Read valid address + `ifdef TSMC_INITIALIZE_FAULT + dbuf_rb = mem[abuf_rb] ^ mem_fault[abuf_rb]; + `else + dbuf_rb = mem[abuf_rb]; + `endif + for (ibb_r = 0 ; ibb_r < Ndata ; ibb_r = ibb_r + 1) + begin + if(QB[ibb_r] == dbuf_rb[ibb_r]) + begin + QB[ibb_r] <= #(dly) dbuf_rb[ibb_r]; + end + else + begin + QB[ibb_r] <= #(dly) dbuf_rb[ibb_r]; + end // else + end // for + end //} valid address + else + begin //{ Invalid address + if(ibb_r <= Naddr) begin + if( MES_ALL=="ON" && $realtime != 0) + $fwrite (log, "\nWarning! Int_Array instance, %m:", + "\n\t Port B read address"); + if( MES_ALL=="ON" && $realtime != 0) + $fwrite (log, " x'%0h' out of range", abuf_rb); + if( MES_ALL=="ON" && $realtime != 0) + $fdisplay (log, + " at time %t.", $realtime, + "\n\t Port B outputs set to unknown."); + end + for (ibb_r = 0 ; ibb_r < Ndata ; ibb_r = ibb_r + 1) + QB[ibb_r] <= #(dly) 1'bx; + end //} invalid address + end //} always @(chgmem or AR) + + + // Task for loading contents of a memory + task preloadData; + input [256*8:1] infile; // Max 256 character File Name + begin + $display ("%m: Reading file, %0s, into the register file", infile); + `ifdef TSMC_INITIALIZE_FORMAT_BINARY + $readmemb (infile, mem, 0, Nword-1); + `else + $readmemh (infile, mem, 0, Nword-1); + `endif + end + endtask + + // Task for displaying contents of a memory + task printMemoryFromTo; + input [Naddr - 1:0] from; // memory content are printed, start from this address. + input [Naddr - 1:0] to; // memory content are printed, end at this address. + integer i; + begin //{ + $display ("\n%m: Memory content dump"); + if(from < 0 || from > to || to >= Nword) + begin + $display ("Error! Invalid address range (%0d, %0d).", from, to, + "\nUsage: %m (from, to);", + "\n where from >= 0 and to <= %0d.", Nword-1); + end + else + begin + $display ("\n Address\tValue"); + for (i = from ; i <= to ; i = i + 1) + $display ("%d\t%b", i, mem[i]); + end + end //} + endtask //} + + // Task for printing entire memory, including normal array and redundancy array. + task printMemory; + integer i; + begin + $display ("Dumping register file..."); + $display("@ Address, content-----"); + for (i = 0; i < Nword; i = i + 1) begin + $display("@%d, %b", i, mem[i]); + end + end + endtask + + task xMemoryAll; + begin + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + dbuf[ib] = 1'bx; + for (iw = 0 ; iw < Nword ; iw = iw + 1) + mem[iw] = dbuf; + end + endtask + + task zeroMemoryAll; + begin + for (ib = 0 ; ib < Ndata ; ib = ib + 1) + dbuf[ib] = 1'b0; + for (iw = 0 ; iw < Nword ; iw = iw + 1) + mem[iw] = dbuf; + end + endtask + endmodule + + + + diff --git a/DA4008_V1.2/model/DEM_Reverse.v b/DA4008_V1.2/model/DEM_Reverse.v new file mode 100644 index 0000000..5136e61 --- /dev/null +++ b/DA4008_V1.2/model/DEM_Reverse.v @@ -0,0 +1,30 @@ +module DEM_Reverse ( + input clk, // 时钟输入 + input [6:0] therm_in, // 7位温度计码输入 (MSB部分) + input [4:0] bin_in, // 5位二进制码输入 (LSB部分) + output reg [7:0] data_out // 恢复的8位DAC输入 +); + +// 统计温度计码中1的个数(权重总和) +function [2:0] count_ones; + input [6:0] data; + integer i; + begin + count_ones = 0; + for (i = 0; i < 7; i = i + 1) begin + if (data[i]) count_ones = count_ones + 1; + end + end +endfunction + +// 组合逻辑计算中间值 +wire [2:0] msb_value = count_ones(therm_in); +wire [4:0] lsb_value = bin_in; +wire [7:0] data_comb = {msb_value, lsb_value}; + +// 在时钟上升沿寄存输出 +always @(posedge clk) begin + data_out <= data_comb; +end + +endmodule \ No newline at end of file diff --git a/DA4008_V1.2/model/DEM_Reverse_64CH.v b/DA4008_V1.2/model/DEM_Reverse_64CH.v new file mode 100644 index 0000000..19ac23d --- /dev/null +++ b/DA4008_V1.2/model/DEM_Reverse_64CH.v @@ -0,0 +1,64 @@ +module DEM_Reverse_64CH ( + input clk + ,input [6:0] msb_in [63:0] + ,input [4:0] lsb_in [63:0] + ,input vld_in + ,output reg vld_out + ,output reg [7:0] data_out [63:0] +); + +reg [7:0] data_out_rr[63:0]; +reg [7:0] data_out_r [63:0]; +reg [1:0] vld_out_r; +genvar k; +generate + + for(k = 0; k < 32; k = k + 1) begin + DEM_Reverse U_DEM_Reverse ( + .clk ( clk ) + ,.therm_in ( msb_in[k] ) + ,.bin_in ( lsb_in[k] ) + ,.data_out ( data_out_r[k] ) + ); + + end + +for(k = 32; k < 64; k = k + 1) begin + DEM_Reverse U_DEM_Reverse ( + .clk ( ~clk ) + ,.therm_in ( msb_in[k] ) + ,.bin_in ( lsb_in[k] ) + ,.data_out ( data_out_r[k] ) + ); + + end + +endgenerate + +generate + + for(k = 0; k < 64; k = k + 1) begin + if(k<32) begin + assign data_out[k] = data_out_r[k]; + end + else begin + assign data_out[k] = data_out_rr[k]; + end + + end + + +endgenerate + + +always @(posedge clk) begin + data_out_rr <= data_out_r; +end + +// \u5728\u65f6\u949f\u4e0a\u5347\u6cbf\u5bc4\u5b58\u8f93\u51fa +always @(posedge clk) begin + vld_out_r <= {vld_out_r[0],vld_in}; +end + +assign vld_out = vld_out_r[1]; +endmodule diff --git a/DA4008_V1.2/model/DW_pulse_sync.v b/DA4008_V1.2/model/DW_pulse_sync.v new file mode 100644 index 0000000..68fa610 --- /dev/null +++ b/DA4008_V1.2/model/DW_pulse_sync.v @@ -0,0 +1,301 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Synopsys Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2004 - 2018 SYNOPSYS INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +// AUTHOR: bruce dean June 26th. 2004 +// +// VERSION: Simulation model +// +// DesignWare_version: 0d24140b +// DesignWare_release: O-2018.06-DWBB_201806.1 +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//---------------------------------------------------------------------------- +// ABSTRACT: Generic pulse sychronization block +// +// +//---------------------------------------------------------------------------- +// Parameters: Valid Values +// ========== ============ +// reg_event [ 0 => event_d will have combination logic +// but latency will be 1 cycle sooner +// 1 => event_d will be retimed so there will +// be no logic between register & port +// but event is delayed 1 cycle] +// f_sync_type [ 0 = single clock design, no synchronizing stages implemented, +// 1 = 2-stage synchronization w/ 1st stage neg-edge & 2nd stage pos-edge capturing, +// 2 = 2-stage synchronization w/ both stages pos-edge capturing, +// 3 = 3-stage synchronization w/ all stages pos-edge capturing ] +// 4 = 4-stage synchronization w/ all stages pos-edge capturing ] +// tst_mode [ 0 = no hold latch inserted, +// 1 = insert hold 'latch' using a neg-edge triggered register +// 2 = insert active-low hold latch ] +// verif_en [ 0 = no sampling errors inserted, +// 1 = sampling errors are randomly inserted with 0 or up to 1 destination clock cycle delays +// 2 = sampling errors are randomly inserted with 0, 0.5, 1, or 1.5 destination clock cycle delays +// 3 = sampling errors are randomly inserted with 0, 1, 2, or 3 destination clock cycle delays +// 4 = sampling errors are randomly inserted with 0 or up to 0.5 destination clock cycle delays ] +// pulse_mode [ 0 => single clock cycle pulse in produces +// single clock cycle pulse out +// 1 => rising edge transition in produces +// 2 => falling edge transition in produces +// single clock cycle pulse out +// 3 => toggle transition in produces +// single clock cycle pulse out] +/// +// Input Ports: Size Description +// =========== ==== =========== +// clk_s 1 bit Source Domain Input Clock +// rst_s_n 1 bit Source Domain Active Low Async. Reset +// init_s_n 1 bit Source Domain Active Low Sync. Reset +// send_s 1 bit Source Domain Active High Send Request +// data_s N bits Source Domain Data Input +// clk_d 1 bit Destination Domain Input Clock +// rst_d_n 1 bit Destination Domain Active Low Async. Reset +// init_d_n 1 bit Destination Domain Active Low Sync. Reset +// test 1 bit Test input +// +// Output Ports Size Description +// ============ ==== =========== +// event_d 1 bit Dest Domain Active High Event Signal +// +// MODIFIED: +// +// RJK 3-08-17 Corrected port order to be consistent with synthesis +// +// DLL 9-21-11 Added tst_mode=2 checking and comments (not a functional change) +// +//---------------------------------------------------------------------------- +//////////////////////////////////////////////////////////////////////////////// +module DW_pulse_sync + ( + clk_s, + rst_s_n, + init_s_n, + event_s, + clk_d, + rst_d_n, + init_d_n, + event_d, + test + ); + parameter integer reg_event = 0; // 0 => event_d will have combination logic + // but latency will be 1 cycle sooner + // 1 => event_d will be retimed so there will + // be no logic between register & port + // but event is delayed 1 cycle + + parameter integer f_sync_type = 1; // 0 - 3 + // 0 => single clock design, i.e. clk_d == clk_s + // 1 => first synchronization in clk_d domain is + // done on the negative edge and the rest + // on positive edge. This reduces latency + // req. of synchronization slightly but + // quicker metastability resolution for + // the negative edge sensitive FF. It also + // requires the technology library to + // contain an acceptable negative edge + // sensitive FF. + // 2 => all synchronization in clk_d domain is + // done on positive edges - 2 d flops in + // destination domain + // 3 => all synchronization in clk_d domain is + // done on positive edges - 3 d flops in + // destination domain + // 4 => all synchronization in clk_d domain is + // done on positive edges - 4 d flops in + // destination domain + parameter integer tst_mode = 0; // 0-2 + // 0 => no latch insertion + // 1 => hold latch using neg edge flop + // 2 => reserved unsupported + + parameter integer verif_en = 1; // 0-4 + // 0 => no sampling errors are used + // 1 => random insertion of 0 or upt to 1 dest clk + // 2 => random insertion of 0,0.5,1,or 1.5 dest clk + // 3 => random insertion of 0,1,2,or 3 dest clk + // 4 => random insertion of 0 or up to 0.5 dest clk + parameter integer pulse_mode = 0; // 0 => single clock cycle pulse in produces + // single clock cycle pulse out + // 1 => rising edge transition in produces + // 2 => falling edge transition in produces + // single clock cycle pulse out + // 3 => toggle transition in produces + // single clock cycle pulse out + +input clk_s; // clock input for source domain +input rst_s_n; // active low async. reset in clk_s domain +input init_s_n; // active low sync. reset in clk_s domain +input event_s; // event pulse input (active high event) +input clk_d; // clock input for destination domain +input rst_d_n; // active low async. reset in clk_d domain +input init_d_n; // active low sync. reset in clk_d domain +output event_d; // event pulse output (active high event) +input test; // test 1 bit Test input + + initial begin + if ((f_sync_type > 0)&&(f_sync_type < 8)) + $display("Information: *** Instance %m is the DW_pulse_sync Clock Domain Crossing Module ***"); + end + +// synopsys translate_off +// Param check + + + initial begin : parameter_check + integer param_err_flg; + + param_err_flg = 0; + + + if ( (reg_event < 0) || (reg_event > 1) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter reg_event (legal range: 0 to 1)", + reg_event ); + end + + if ( ((f_sync_type & 7) < 0) || ((f_sync_type & 7) > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter (f_sync_type & 7) (legal range: 0 to 4)", + (f_sync_type & 7) ); + end + + if ( (tst_mode < 0) || (tst_mode > 2) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter tst_mode (legal range: 0 to 2)", + tst_mode ); + end + + if ( (verif_en < 0) || (verif_en > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter verif_en (legal range: 0 to 4)", + verif_en ); + end + + if ( (pulse_mode < 0) || (pulse_mode > 3) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter pulse_mode (legal range: 0 to 3)", + pulse_mode ); + end + + if ( param_err_flg == 1) begin + $display( + "%m :\n Simulation aborted due to invalid parameter value(s)"); + $finish; + end + + end // parameter_check + +wire O0I100OO; +reg O1O10OI0; +reg OO10OI10; +reg [1:0] O0OlIO00; +wire II1lIlI0; +reg OOO01l10; +reg O00O000l; +wire O101lOO0; + + +generate + if (((f_sync_type&7)>1)&&(tst_mode==2)) begin : GEN_LATCH_frwd_hold_latch_PROC + reg [1-1:0] OO10OI10; + always @ (clk_s or O1O10OI0) begin : LATCH_frwd_hold_latch_PROC_PROC + + if (clk_s == 1'b0) + + OO10OI10 = O1O10OI0; + + + end // LATCH_frwd_hold_latch_PROC_PROC + + + assign O0I100OO = (test==1'b1)? OO10OI10 : O1O10OI0; + + end else begin : GEN_DIRECT_frwd_hold_latch_PROC + assign O0I100OO = O1O10OI0; + end +endgenerate + + DW_sync #(1, f_sync_type+8, tst_mode, verif_en) SIM( + .clk_d(clk_d), + .rst_d_n(rst_d_n), + .init_d_n(init_d_n), + .data_s(O0I100OO), + .test(test), + .data_d(II1lIlI0) ); +assign O101lOO0 = pulse_mode === 0 ? event_s ^ O1O10OI0 + :(pulse_mode === 1? (event_s & ! O00O000l) ^ O1O10OI0 + :(pulse_mode === 2? (!event_s & O00O000l) ^ O1O10OI0 + :(pulse_mode === 3? (event_s ^ O00O000l) ^ O1O10OI0: 1'bx))); +always @ ( posedge clk_s or negedge rst_s_n ) begin : a1000_PROC + if(rst_s_n === 1'b0 ) begin + O1O10OI0 <= 1'b0; + O00O000l <= 1'b0; + end else if(rst_s_n === 1'b1 ) begin + if(init_s_n === 1'b0 ) begin + O1O10OI0 <= 1'b0; + O00O000l <= 1'b0; + end else if(init_s_n === 1'b1 ) begin + if(event_s === 1'b1) begin + O1O10OI0 <= O101lOO0; + O00O000l <= event_s; + end else if(event_s !== 1'b0) begin + O1O10OI0 <= 1'bx; + O00O000l <= 1'bx; + end else begin + O1O10OI0 <= O101lOO0; + O00O000l <= event_s; + end + end else begin + O1O10OI0 <= 1'bx; + O00O000l <= 1'bx; + end + end else begin + O1O10OI0 <= 1'bx; + O00O000l <= 1'bx; + end +end + always @ ( posedge clk_d or negedge rst_d_n) begin : a1001_PROC + if(rst_d_n === 1'b0 ) + O0OlIO00 <= 2'b00; + else if(rst_d_n === 1'b1 ) + if(init_d_n === 1'b0) + O0OlIO00 <= 2'b00; + else if(init_d_n === 1'b1) + O0OlIO00 <= {O0OlIO00[0] ^ II1lIlI0, II1lIlI0}; + else + O0OlIO00 <= 2'bxx; + else + O0OlIO00 <= 2'bxx; + end + assign event_d = (reg_event) ? O0OlIO00[1] : O0OlIO00[0] ^ II1lIlI0 ; + + always @ (clk_d) begin : monitor_clk_d + if ( (clk_d !== 1'b0) && (clk_d !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_d input.", + $time, clk_d ); + end // monitor_clk_d + + always @ (clk_s) begin : monitor_clk_s + if ( (clk_s !== 1'b0) && (clk_s !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_s input.", + $time, clk_s ); + end // monitor_clk_s + // synopsys translate_on + +endmodule diff --git a/DA4008_V1.2/model/DW_reset_sync.v b/DA4008_V1.2/model/DW_reset_sync.v new file mode 100644 index 0000000..fdaf284 --- /dev/null +++ b/DA4008_V1.2/model/DW_reset_sync.v @@ -0,0 +1,547 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Synopsys Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2005 - 2018 SYNOPSYS INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +// AUTHOR: Doug Lee 12/7/05 +// +// VERSION: Simulation Architecture +// +// DesignWare_version: b7a01861 +// DesignWare_release: O-2018.06-DWBB_201806.1 +// +//////////////////////////////////////////////////////////////////////////////// +// +// ABSTRACT: Reset Sequence Synchronizer Simulation Model +// +// +// This synchronizer coordinates reset to the source and destination domains which initiated by +// either domain. +// +// Parameters: Valid Values +// ========== ============ +// f_sync_type default: 2 +// Forward Synchronized Type (Source to Destination Domains) +// 0 = single clock design, no synchronizing stages implemented, +// 1 = 2-stage synchronization w/ 1st stage neg-edge & 2nd stage pos-edge capturing, +// 2 = 2-stage synchronization w/ both stages pos-edge capturing, +// 3 = 3-stage synchronization w/ all stages pos-edge capturing +// 4 = 4-stage synchronization w/ all stages pos-edge capturing +// r_sync_type default: 2 +// Reverse Synchronization Type (Destination to Source Domains) +// 0 = single clock design, no synchronizing stages implemented, +// 1 = 2-stage synchronization w/ 1st stage neg-edge & 2nd stage pos-edge capturing, +// 2 = 2-stage synchronization w/ both stages pos-edge capturing, +// 3 = 3-stage synchronization w/ all stages pos-edge capturing +// 4 = 4-stage synchronization w/ all stages pos-edge capturing +// clk_d_faster default: 1 +// clk_d faster than clk_s by difference ratio +// 0 = Either clr_s or clr_d active with the other tied low at input +// 1 to 15 = ratio of clk_d to clk_s plus 1 +// reg_in_prog default: 1 +// Register the 'clr_in_prog_s' and 'clr_in_prog_d' Outputs +// 0 = unregistered +// 1 = registered +// tst_mode default: 0 +// Test Mode Setting +// 0 = no hold latch inserted, +// 1 = insert hold 'latch' using a neg-edge triggered register +// 2 = insert hold latch using active low latch +// verif_en default: 1 +// Verification Enable (simulation only) +// 0 = no sampling errors inserted, +// 1 = sampling errors are randomly inserted with 0 or up to 1 destination clock cycle delays +// 2 = sampling errors are randomly inserted with 0, 0.5, 1, or 1.5 destination clock cycle delays +// 3 = sampling errors are randomly inserted with 0, 1, 2, or 3 destination clock cycle delays +// 4 = sampling errors are randomly inserted with 0 or up to 0.5 destination clock cycle delays +// +// Input Ports: Size Description +// =========== ==== =========== +// clk_s 1 bit Source Domain Input Clock +// rst_s_n 1 bit Source Domain Active Low Async. Reset +// init_s_n 1 bit Source Domain Active Low Sync. Reset +// clr_s 1 bit Source Domain Clear Initiated +// clk_d 1 bit Destination Domain Input Clock +// rst_d_n 1 bit Destination Domain Active Low Async. Reset +// init_d_n 1 bit Destination Domain Active Low Sync. Reset +// clr_d 1 bit Destination Domain Clear Initiated +// test 1 bit Test input +// +// Output Ports Size Description +// ============ ==== =========== +// clr_sync_s 1 bit Source Domain Clear +// clr_in_prog_s 1 bit Source Domain Clear in Progress +// clr_cmplt_s 1 bit Source Domain Clear Complete (pulse) +// clr_in_prog_d 1 bit Destination Domain Clear in Progress +// clr_sync_d 1 bit Destination Domain Clear (pulse) +// clr_cmplt_d 1 bit Destination Domain Clear Complete (pulse) +// +// MODIFIED: +// DLL 5-7-15 (1) Restricted the amount of missampling allowed for DW_pulse_sync +// U_PS_DEST_INIT to make delay more realistic. +// (2) Changed 'reg_event' from '1' to '0' for instance U_PS_DEST_INIT +// to allow 'clr_in_prog_s' to occur one cycle earlier that +// helps prevent a race condition on signals syncrhonized back +// to the source domain. +// Addresses fix for STAR#9000896107 (filed against DW_fifoctl_2c_df but +// is really a DW_reset_sync issue). +// +// DLL 7-22-11 Add inherent delay to the feedback path in the destination +// domain and clr_in_prog_d. This effectively extends the +// destination domain acive clearing state. +// Also, added 'tst_mode = 2' capability. +// +// DLL 12-2-10 Removed assertions since only ones left were not +// relevant any more. This fix is by-product of investigating +// STAR#9000435571. +// +// DLL 9-5-08 Accommodate sustained "clr_s" and "clr_d" assertion behavior. +// Satisfies STAR#9000261751. +// +// DLL 8-11-08 Filter long pulses of "clr_s" and "clr_d" to one +// clock cycle pulses. +// +// DLL 10-31-06 Added SystemVerilog assertions +// +// DLL 8-21-06 Added parameters 'r_sync_type', 'clk_d_faster', 'reg_in_prog'. +// Added Destination outputs 'clr_in_prog_d' and 'clr_cmplt_d' +// and changed Source output 'lO1O1011' to 'clr_cmplt_s'. +// +// DLL 6-14-06 Removed unnecessary To_X01 processing some input signals +// +// DLL 11-7-06 Modified functionality to support f_sync_type = 4 and +// r_sync_type = 4 +// +module DW_reset_sync ( + clk_s, + rst_s_n, + init_s_n, + clr_s, + clr_sync_s, + clr_in_prog_s, + clr_cmplt_s, + + clk_d, + rst_d_n, + init_d_n, + clr_d, + clr_in_prog_d, + clr_sync_d, + clr_cmplt_d, + + test + ); + +parameter integer f_sync_type = 2; // RANGE 0 to 4 +parameter integer r_sync_type = 2; // RANGE 0 to 4 +parameter integer clk_d_faster = 1; // RANGE 0 to 15 +parameter integer reg_in_prog = 1; // RANGE 0 to 1 +parameter integer tst_mode = 0; // RANGE 0 to 2 +parameter integer verif_en = 1; // RANGE 0 to 4 + +`define DW_IIOOl10O 2 + +localparam O0llO1Ol = ((verif_en==2)?4:((verif_en==3)?1:verif_en)); + + +input clk_s; // clock input from source domain +input rst_s_n; // active low asynchronous reset from source domain +input init_s_n; // active low synchronous reset from source domain +input clr_s; // active high clear from source domain +output clr_sync_s; // clear to source domain sequential devices +output clr_in_prog_s; // clear in progress status to source domain +output clr_cmplt_s; // clear sequence complete (pulse) + +input clk_d; // clock input from destination domain +input rst_d_n; // active low asynchronous reset from destination domain +input init_d_n; // active low synchronous reset from destination domain +input clr_d; // active high clear from destination domain +output clr_in_prog_d; // clear in progress status to source domain +output clr_sync_d; // clear to destination domain sequential devices (pulse) +output clr_cmplt_d; // clear sequence complete (pulse) + +input test; // test input + +// synopsys translate_off + + + + + + + //------------------------------------------------------------------------- + // Parameter legality check + //------------------------------------------------------------------------- + + + initial begin : parameter_check + integer param_err_flg; + + param_err_flg = 0; + + + if ( ((f_sync_type & 7) < 0) || ((f_sync_type & 7) > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter (f_sync_type & 7) (legal range: 0 to 4)", + (f_sync_type & 7) ); + end + + if ( ((r_sync_type & 7) < 0) || ((r_sync_type & 7) > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter (r_sync_type & 7) (legal range: 0 to 4)", + (r_sync_type & 7) ); + end + + if ( (reg_in_prog < 0) || (reg_in_prog > 1) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter reg_in_prog (legal range: 0 to 1)", + reg_in_prog ); + end + + if ( (tst_mode < 0) || (tst_mode > 2) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter tst_mode (legal range: 0 to 2)", + tst_mode ); + end + + if ( (verif_en < 0) || (verif_en > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter verif_en (legal range: 0 to 4)", + verif_en ); + end + + if ( param_err_flg == 1) begin + $display( + "%m :\n Simulation aborted due to invalid parameter value(s)"); + $finish; + end + + end // parameter_check + + + wire lOl0I0l1; + wire Il0110O1; + wire O010111l; + + integer I01O0111; + integer l1010110; + + reg O1111O0O; + wire OOlIO1OO; + reg lll0OO11; + wire I0I0O1l1; + wire lO1O1011; + + reg l011lO0l; + wire l00O0lO1; + wire l11Ol01I; + wire OI01IO11; + wire l0Ol100I; + reg l10Ol00O; + + wire IOIOOIlO; + wire OOI1001O; + + reg O100OIlI; + wire l0IlI00O; + reg IIOOI0Ol; + reg Il1O110I; + reg O1OOO1O0; + wire O0OIl111; + + integer OOOOIlO1; + integer OI1IO11l; + + reg OlOOO000; + wire IllIlOl0; + wire I0OO1l01; + wire lI1IO1O0; + reg OO001I10; + + wire O0III10l; + reg IO00llI0; + + wire OOlOO11O; + reg OIO10I11; + + integer O0IOO0OO; + + + +assign IllIlOl0 = (reg_in_prog == 0) ? ((IOIOOIlO && !OlOOO000) || + (((OI1IO11l == 1) && (OOOOIlO1 == 0)) && IOIOOIlO)) : +// (!clr_in_prog_d && IOIOOIlO); + (OI1IO11l == 1) && (OOOOIlO1 == 0); +assign I0OO1l01 = (OI1IO11l == 0) && (OOOOIlO1 == 1); +assign lI1IO1O0 = (IllIlOl0 && !I0OO1l01) ? 1'b1 : + (I0OO1l01) ? 1'b0 : OO001I10; + + + + initial begin + if ((f_sync_type > 0)&&(f_sync_type < 8)) + $display("Information: *** Instance %m is the DW_reset_sync Clock Domain Crossing Module ***"); + end + + +DW_pulse_sync #(1, (f_sync_type + 8), tst_mode, verif_en, 1) U_PS_SRC_INIT ( + .clk_s(clk_s), + .rst_s_n(rst_s_n), + .init_s_n(init_s_n), + .event_s(clr_s), + .clk_d(clk_d), + .rst_d_n(rst_d_n), + .init_d_n(init_d_n), + .test(test), + .event_d(lOl0I0l1) + ); + + + +generate + if (((f_sync_type&7)>1)&&(tst_mode==2)) begin : GEN_LATCH_frwd_hold_latch_PROC + reg [1-1:0] OIO10I11; + always @ (clk_s or clr_s) begin : LATCH_frwd_hold_latch_PROC_PROC + + if (clk_s == 1'b0) + + OIO10I11 = clr_s; + + + end // LATCH_frwd_hold_latch_PROC_PROC + + + assign OOlOO11O = (test==1'b1)? OIO10I11 : clr_s; + + end else begin : GEN_DIRECT_frwd_hold_latch_PROC + assign OOlOO11O = clr_s; + end +endgenerate + + DW_sync #(1, f_sync_type+8, tst_mode, verif_en) U_SYNC_CLR_S( + .clk_d(clk_d), + .rst_d_n(rst_d_n), + .init_d_n(init_d_n), + .data_s(OOlOO11O), + .test(test), + .data_d(Il0110O1) ); + +assign O010111l = lOl0I0l1 || Il0110O1; + + + +DW_pulse_sync #(0, (r_sync_type + 8), tst_mode, O0llO1Ol, 0) U_PS_DEST_INIT ( + .clk_s(clk_d), + .rst_s_n(rst_d_n), + .init_s_n(init_d_n), + .event_s(OOI1001O), + .clk_d(clk_s), + .rst_d_n(rst_s_n), + .init_d_n(init_s_n), + .test(test), + .event_d(OI01IO11) + ); + +DW_pulse_sync #(0, (f_sync_type + 8), tst_mode, verif_en, 0) U_PS_FB_DEST ( + .clk_s(clk_s), + .rst_s_n(rst_s_n), + .init_s_n(init_s_n), + .event_s(l10Ol00O), + .clk_d(clk_d), + .rst_d_n(rst_d_n), + .init_d_n(init_d_n), + .test(test), + .event_d(l11Ol01I) + ); + +assign O0III10l = (l11Ol01I && IOIOOIlO) ? 1'b1 : + (!l11Ol01I && !IOIOOIlO && IO00llI0) ? 1'b0 : + IO00llI0; +assign l00O0lO1 = (l11Ol01I && !IOIOOIlO && !IO00llI0) || + (!l11Ol01I && !IOIOOIlO && IO00llI0); + +DW_pulse_sync #(0, (r_sync_type + 8), tst_mode, verif_en, 0) U_PS_ACK ( + .clk_s(clk_d), + .rst_s_n(rst_d_n), + .init_s_n(init_d_n), + .event_s(l011lO0l), + .clk_d(clk_s), + .rst_d_n(rst_s_n), + .init_d_n(init_s_n), + .test(test), + .event_d(lO1O1011) + ); + + always @(OI01IO11 or lO1O1011 or I01O0111) begin : a1000_PROC + if (OI01IO11 && ~lO1O1011) begin + if (I01O0111 === `DW_IIOOl10O) + l1010110 = I01O0111; + else + l1010110 = I01O0111 + 1; + end else if (~OI01IO11 && lO1O1011) begin + if (I01O0111 === 0) + l1010110 = I01O0111; + else + l1010110 = I01O0111 - 1; + end else begin + l1010110 = I01O0111; + end + end + + assign OOlIO1OO = (l1010110 > 0); + + assign I0I0O1l1 = lO1O1011 && ((I01O0111 === 1) && (l1010110 === 0)); + + assign IOIOOIlO = O010111l || clr_d; + assign OOI1001O = IOIOOIlO && !OO001I10; + + assign l0IlI00O = (OI1IO11l > 0); + + assign l0Ol100I = l00O0lO1 & ~OOI1001O; + + + always @(OOI1001O or l011lO0l or OOOOIlO1) begin : a1001_PROC + if (OOI1001O && ~l011lO0l) begin + if (OOOOIlO1 === `DW_IIOOl10O) + OI1IO11l = OOOOIlO1; + else + OI1IO11l = OOOOIlO1 + 1; + end else if (~OOI1001O && l011lO0l) begin + if (OOOOIlO1 === 0) + OI1IO11l = OOOOIlO1; + else + OI1IO11l = OOOOIlO1 - 1; + end else begin + OI1IO11l = OOOOIlO1; + end + end + + assign O0OIl111 = ~O100OIlI && IIOOI0Ol; + + + always @(posedge clk_s or negedge rst_s_n) begin : a1002_PROC + if (rst_s_n === 1'b0) begin + I01O0111 <= 0; + l10Ol00O <= 1'b0; + O1111O0O <= 1'b0; + lll0OO11 <= 1'b0; + end else if (rst_s_n === 1'b1) begin + if (init_s_n === 1'b0) begin + I01O0111 <= 0; + l10Ol00O <= 1'b0; + O1111O0O <= 1'b0; + lll0OO11 <= 1'b0; + end else if (init_s_n === 1'b1) begin + I01O0111 <= l1010110; + l10Ol00O <= OI01IO11; + O1111O0O <= OOlIO1OO; + lll0OO11 <= I0I0O1l1; + end else begin + I01O0111 <= -1; + l10Ol00O <= 1'bX; + O1111O0O <= 1'bX; + lll0OO11 <= 1'bX; + end + end else begin + I01O0111 <= -1; + l10Ol00O <= 1'bX; + O1111O0O <= 1'bX; + lll0OO11 <= 1'bX; + end + end + + always @(posedge clk_d or negedge rst_d_n) begin : a1003_PROC + if (rst_d_n === 1'b0) begin + OlOOO000 <= 1'b0; + OO001I10 <= 1'b0; + OOOOIlO1 <= 0; + O100OIlI <= 1'b0; + IIOOI0Ol <= 1'b0; + l011lO0l <= 1'b0; + Il1O110I <= 1'b0; + O1OOO1O0 <= 1'b0; + IO00llI0 <= 1'b0; + end else if (rst_d_n === 1'b1) begin + if (init_d_n === 1'b0) begin + OlOOO000 <= 1'b0; + OO001I10 <= 1'b0; + OOOOIlO1 <= 0; + O100OIlI <= 1'b0; + IIOOI0Ol <= 1'b0; + l011lO0l <= 1'b0; + Il1O110I <= 1'b0; + O1OOO1O0 <= 1'b0; + IO00llI0 <= 1'b0; + end else if (init_d_n === 1'b1) begin + OlOOO000 <= IOIOOIlO; + OO001I10 <= lI1IO1O0; + OOOOIlO1 <= OI1IO11l; + O100OIlI <= l0IlI00O; + IIOOI0Ol <= O100OIlI; + l011lO0l <= l00O0lO1; + Il1O110I <= l0Ol100I; + O1OOO1O0 <= O0OIl111; + IO00llI0 <= O0III10l; + end else begin + OlOOO000 <= 1'bX; + OO001I10 <= 1'bX; + OOOOIlO1 <= -1; + O100OIlI <= 1'bX; + IIOOI0Ol <= 1'bX; + l011lO0l <= 1'bX; + Il1O110I <= 1'bX; + O1OOO1O0 <= 1'bX; + IO00llI0 <= 1'bX; + end + end else begin + OlOOO000 <= 1'bX; + OO001I10 <= 1'bX; + OOOOIlO1 <= -1; + O100OIlI <= 1'bX; + IIOOI0Ol <= 1'bX; + l011lO0l <= 1'bX; + Il1O110I <= 1'bX; + O1OOO1O0 <= 1'bX; + IO00llI0 <= 1'bX; + end + end + + assign clr_sync_s = OI01IO11; + assign clr_cmplt_s = lll0OO11; + assign clr_in_prog_s = (reg_in_prog == 0) ? OOlIO1OO : O1111O0O; + assign clr_in_prog_d = (reg_in_prog == 0) ? O100OIlI : IIOOI0Ol; + assign clr_sync_d = Il1O110I; + assign clr_cmplt_d = O1OOO1O0; + + + + always @ (clk_s) begin : monitor_clk_s + if ( (clk_s !== 1'b0) && (clk_s !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_s input.", + $time, clk_s ); + end // monitor_clk_s + + always @ (clk_d) begin : monitor_clk_d + if ( (clk_d !== 1'b0) && (clk_d !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_d input.", + $time, clk_d ); + end // monitor_clk_d + + +// synopsys translate_on +`undef DW_IIOOl10O +endmodule +/* vcs gen_ip dbg_ip off */ + /* */ diff --git a/DA4008_V1.2/model/DW_stream_sync.v b/DA4008_V1.2/model/DW_stream_sync.v new file mode 100644 index 0000000..5144c00 --- /dev/null +++ b/DA4008_V1.2/model/DW_stream_sync.v @@ -0,0 +1,496 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Synopsys Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2005 - 2018 SYNOPSYS INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +// AUTHOR: Doug Lee 12/20/05 +// +// VERSION: Simulation Architecture +// +// DesignWare_version: 2105953f +// DesignWare_release: O-2018.06-DWBB_201806.1 +// +//////////////////////////////////////////////////////////////////////////////// +// +// ABSTRACT: Data Stream Synchronizer Simulation Model +// +// This synchronizes an incoming data stream from a source domain +// to a destination domain with a minimum amount of latency. +// +// Parameters: Valid Values Description +// ========== ============ =========== +// width 1 to 1024 default: 8 +// Width of data_s and data_d ports +// +// depth 2 to 256 default: 4 +// Depth of FIFO +// +// prefill_lvl 0 to depth-1 default: 0 +// number of FIFO locations filled before +// transferring to destination domain ] +// +// f_sync_type 0 to 4 default: 2 +// Forward Synchronization Type (Source to Destination Domains) +// 0 => no synchronization, single clock system +// 1 => 2-stage synchronization w/ 1st stage neg-edge & 2nd stage pos-edge capturing +// 2 => 2-stage synchronization w/ both stages pos-edge capturing +// 3 => 3-stage synchronization w/ all stages pos-edge capturing +// 4 => 4-stage synchronization w/ all stages pos-edge capturing +// +// reg_stat 0 or 1 default: 1 +// Register internally calculated status +// 0 => don't register internally calculated status +// 1 => register internally calculated status +// +// tst_mode 0 or 2 default: 0 +// Insert neg-edge hold latch at front-end of synchronizers during "test" +// 0 => no hold latch inserted, +// 1 => insert hold 'latch' using a neg-edge triggered register +// 2 => insert hold latch using an active low latch +// +// verif_en 0 to 4 default: 1 +// Enable missampling of synchronized signals during simulation +// 0 => no sampling errors inserted, +// 1 => sampling errors are randomly inserted with 0 or up to 1 destination clock cycle delays +// 2 => sampling errors are randomly inserted with 0, 0.5, 1, or 1.5 destination clock cycle delays +// 3 => sampling errors are randomly inserted with 0, 1, 2, or 3 destination clock cycle delays +// 4 => sampling errors are randomly inserted with 0 or up to 0.5 destination clock cycle delays +// +// r_sync_type 0 to 4 default: 2 +// Reverse Synchronization Type (Destination to Source Domains) +// 0 => no synchronization, single clock system +// 1 => 2-stage synchronization w/ 1st stage neg-edge & 2nd stage pos-edge capturing +// 2 => 2-stage synchronization w/ both stages pos-edge capturing +// 3 => 3-stage synchronization w/ all stages pos-edge capturing +// 4 => 4-stage synchronization w/ all stages pos-edge capturing +// +// clk_d_faster 0 to 15 default: 1 +// clk_d faster than clk_s by difference ratio +// 0 => Either clr_s or clr_d active with the other tied low at input +// 1 to 15 => ratio of clk_d to clk_s frequencies plus 1 +// +// reg_in_prog 0 or 1 default: 1 +// Register the 'clr_in_prog_s' and 'clr_in_prog_d' Outputs +// 0 => unregistered +// 1 => registered +// +// Input Ports: Size Description +// =========== ==== =========== +// clk_s 1 bit Source Domain Input Clock +// rst_s_n 1 bit Source Domain Active Low Async. Reset +// init_s_n 1 bit Source Domain Active Low Sync. Reset +// clr_s 1 bit Source Domain Internal Logic Clear (reset) +// send_s 1 bit Source Domain Active High Send Request +// data_s N bits Source Domain Data +// +// clk_d 1 bit Destination Domain Input Clock +// rst_d_n 1 bit Destination Domain Active Low Async. Reset +// init_d_n 1 bit Destination Domain Active Low Sync. Reset +// clr_d 1 bit Destination Domain Internal Logic Clear (reset) +// prefill_d 1 bit Destination Domain Prefill Control +// +// test 1 bit Test input +// +// Output Ports Size Description +// ============ ==== =========== +// clr_sync_d 1 bit Source Domain Clear +// clr_in_prog_s 1 bit Source Domain Clear in Progress +// clr_cmplt_s 1 bit Soruce Domain Clear Complete (pulse) +// +// clr_in_prog_d 1 bit Destination Domain Clear in Progress +// clr_sync_d 1 bit Destination Domain Clear (pulse) +// clr_cmplt_d 1 bit Destination Domain Clear Complete (pulse) +// data_avail_d 1 bit Destination Domain Data Available +// data_d N bits Destination Domain Data +// prefilling_d 1 bit Destination Domain Prefillng Status +// +// Note: (1) The value of N is equal to the 'width' parameter value +// +// +// MODIFIED: +// 05/06/16 RJK Removed some X propagation coding that interferes with VCS +// NLP flow and is redundant since VCS added X propagation options +// +// 07/25/11 DLL Removed or-ing of 'clr_in_prog_d' with 'init_d_n' that +// wires to DW_sync 'init_d_n' input port. +// Added checking and comments for tst_mode = 2. +// +// 10/20/06 DLL Updated with new version of DW_reset_sync +// +// 11/15/06 DLL Added 4-stage synchronization capability +// +// 7/13/09 DLL Changed all `define declarations to have the +// "DW_" prefix and then `undef them at the approprite time. +// +// +// +module DW_stream_sync ( + clk_s, + rst_s_n, + init_s_n, + clr_s, + send_s, + data_s, + clr_sync_s, + clr_in_prog_s, + clr_cmplt_s, + + clk_d, + rst_d_n, + init_d_n, + clr_d, + prefill_d, + clr_in_prog_d, + clr_sync_d, + clr_cmplt_d, + data_avail_d, + data_d, + prefilling_d, + + test + ); + +parameter integer width = 8; // RANGE 1 to 1024 +parameter integer depth = 4; // RANGE 2 to 256 +parameter integer prefill_lvl = 0; // RANGE 0 to 255 +parameter integer f_sync_type = 2; // RANGE 0 to 4 +parameter integer reg_stat = 1; // RANGE 0 to 1 +parameter integer tst_mode = 0; // RANGE 0 to 2 +parameter integer verif_en = 1; // RANGE 0 to 4 +parameter integer r_sync_type = 2; // RANGE 0 to 4 +parameter integer clk_d_faster = 1; // RANGE 0 to 15 +parameter integer reg_in_prog = 1; // RANGE 0 to 1 + +localparam cnt_depth = ((depth>16)?((depth>64)?((depth>128)?8:7):((depth>32)?6:5)):((depth>4)?((depth>8)?4:3):((depth>2)?2:1))); +localparam sync_verif_en = (verif_en == 2) ? 4 : (verif_en == 3) ? 1 : verif_en; + + +input clk_s; // clock input from source domain +input rst_s_n; // active low asynchronous reset from source domain +input init_s_n; // active low synchronous reset from source domain +input clr_s; // active high clear from source domain +input send_s; // active high send request from source domain +input [width-1:0] data_s; // data to be synchronized from source domain +output clr_sync_s; // clear to source domain sequential devices +output clr_in_prog_s; // clear in progress status to source domain +output clr_cmplt_s; // clear sequence complete (pulse) + +input clk_d; // clock input from destination domain +input rst_d_n; // active low asynchronous reset from destination domain +input init_d_n; // active low synchronous reset from destination domain +input clr_d; // active high clear from destination domain +input prefill_d; // active high prefill control from destination domain +output clr_in_prog_d; // clear in progress status to source domain +output clr_sync_d; // clear to destination domain sequential devices (pulse) +output clr_cmplt_d; // clear sequence complete (pulse) +output data_avail_d; // data available to destination domain +output [width-1:0] data_d; // data synchronized to destination domain +output prefilling_d; // prefilling status to destination domain + +input test; // test input + +// synopsys translate_off + + + //------------------------------------------------------------------------- + // Parameter legality check + //------------------------------------------------------------------------- + + + initial begin : parameter_check + integer param_err_flg; + + param_err_flg = 0; + + + if ( (depth < 2) || (depth > 256) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter depth (legal range: 2 to 256)", + depth ); + end + + if ( (prefill_lvl < 0) || (prefill_lvl > depth-1) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter prefill_lvl (legal range: 0 to depth-1)", + prefill_lvl ); + end + + if ( ((f_sync_type & 7) < 0) || ((f_sync_type & 7) > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter (f_sync_type & 7) (legal range: 0 to 4)", + (f_sync_type & 7) ); + end + + if ( (reg_stat < 0) || (reg_stat > 1) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter reg_stat (legal range: 0 to 1)", + reg_stat ); + end + + if ( (tst_mode < 0) || (tst_mode > 2) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter tst_mode (legal range: 0 to 2)", + tst_mode ); + end + + if ( (verif_en < 0) || (verif_en > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter verif_en (legal range: 0 to 4)", + verif_en ); + end + + if ( ((r_sync_type & 7) < 0) || ((r_sync_type & 7) > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter (r_sync_type & 7) (legal range: 0 to 4)", + (r_sync_type & 7) ); + end + + if ( (clk_d_faster < 0) || (clk_d_faster > 15) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter clk_d_faster (legal range: 0 to 15)", + clk_d_faster ); + end + + if ( (reg_in_prog < 0) || (reg_in_prog > 1) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter reg_in_prog (legal range: 0 to 1)", + reg_in_prog ); + end + + if ( param_err_flg == 1) begin + $display( + "%m :\n Simulation aborted due to invalid parameter value(s)"); + $finish; + end + + end // parameter_check + + + wire next_data_avail_d_int; + reg data_avail_d_int; + wire [width-1:0] next_data_d_int; + reg [width-1:0] data_d_int; + wire next_prefilling_d_int; + reg prefilling_d_int; + + reg [width-1:0] data_mem [0:depth-1]; + + wire [cnt_depth-1:0] next_wr_ptr_s; + reg [cnt_depth-1:0] wr_ptr_s; + wire [cnt_depth-1:0] next_rd_ptr_d; + reg [cnt_depth-1:0] rd_ptr_d; + + reg [cnt_depth-1:0] next_valid_cnt; + reg [cnt_depth-1:0] valid_cnt; + + wire [depth-1:0] next_event_vec_s; + reg [depth-1:0] event_vec_s; + reg [depth-1:0] event_vec_l; + wire [depth-1:0] event_vec_selected; + wire [depth-1:0] dw_sync_event_vec; + + wire next_detect_lvl; + reg detect_lvl; + + wire [31:0] one; + + integer i, idx; + + assign one = 1; + + + initial begin + if ((f_sync_type > 0)&&(f_sync_type < 8)) + $display("Information: *** Instance %m is the DW_stream_sync Clock Domain Crossing Module ***"); + end + + + +DW_reset_sync #((f_sync_type + 8), (r_sync_type + 8), clk_d_faster, reg_in_prog, tst_mode, verif_en) U_RST_SYNC ( + .clk_s(clk_s), + .rst_s_n(rst_s_n), + .init_s_n(init_s_n), + .clr_s(clr_s), + .clk_d(clk_d), + .rst_d_n(rst_d_n), + .init_d_n(init_d_n), + .clr_d(clr_d), + .test(test), + .clr_sync_s(clr_sync_s), + .clr_in_prog_s(clr_in_prog_s), + .clr_cmplt_s(clr_cmplt_s), + .clr_in_prog_d(clr_in_prog_d), + .clr_sync_d(clr_sync_d), + .clr_cmplt_d(clr_cmplt_d) + ); + + + +always @(posedge clk_s or negedge rst_s_n) begin : a1001_PROC + if (rst_s_n == 1'b0) begin + for (idx = 0; idx < depth; idx = idx + 1) begin + data_mem[idx] <= {width{1'b0}}; + end + end else begin + if (!init_s_n || clr_in_prog_s) begin + for (idx = 0; idx < depth; idx = idx + 1) begin + data_mem[idx] <= {width{1'b0}}; + end + end else begin + if (send_s == 1'b1) begin + data_mem[wr_ptr_s] <= data_s; + end + end + end + +end + +assign next_wr_ptr_s = (send_s == 1'b1) ? ((wr_ptr_s === depth-1) ? {cnt_depth{1'b0}} : + wr_ptr_s + one[cnt_depth-1:0]) : wr_ptr_s; + +assign next_event_vec_s = (send_s == 1'b1) ? {event_vec_s[depth-2:0], ~event_vec_s[depth-1]} : + event_vec_s; + + + +generate + if (((f_sync_type&7)>1)&&(tst_mode==2)) begin : GEN_LATCH_hold_latch_PROC + reg [depth-1:0] event_vec_l; + always @ (clk_s or event_vec_s) begin : LATCH_hold_latch_PROC_PROC + + if (clk_s == 1'b0) + + event_vec_l = event_vec_s; + + + end // LATCH_hold_latch_PROC_PROC + + + assign event_vec_selected = (test==1'b1)? event_vec_l : event_vec_s; + + end else begin : GEN_DIRECT_hold_latch_PROC + assign event_vec_selected = event_vec_s; + end +endgenerate + + DW_sync #(depth, f_sync_type+8, tst_mode, sync_verif_en) U_SYNC( + .clk_d(clk_d), + .rst_d_n(rst_d_n), + .init_d_n(init_d_n), + .data_s(event_vec_selected), + .test(test), + .data_d(dw_sync_event_vec) ); + +always @(dw_sync_event_vec or next_valid_cnt or rd_ptr_d) begin : a1002_PROC + next_valid_cnt = {cnt_depth{1'b0}}; + for (i = 0; i < depth; i = i + 1) begin + if (rd_ptr_d > i) begin + next_valid_cnt = next_valid_cnt + (dw_sync_event_vec[i] === ~detect_lvl); + end else begin + next_valid_cnt = next_valid_cnt + (dw_sync_event_vec[i] === detect_lvl); + end + if (dw_sync_event_vec[i] === 1'bX) + next_valid_cnt = {cnt_depth{1'b0}}; + end +end + + +assign next_rd_ptr_d = next_data_avail_d_int ? ((rd_ptr_d === depth-1) ? {cnt_depth{1'b0}} : (rd_ptr_d + one[cnt_depth-1:0])) : + rd_ptr_d; + +assign next_detect_lvl = (next_data_avail_d_int && (next_rd_ptr_d === {cnt_depth{1'b0}})) ? + ~detect_lvl : detect_lvl; + + +assign next_prefilling_d_int = ((prefill_d === 1'bX) || (prefilling_d_int === 1'bX)) ? 1'bX : + (prefill_lvl == 0) ? 1'b0 : + ((prefill_d === 1'b1) && (prefill_lvl > (reg_stat ? valid_cnt : next_valid_cnt))) ? 1'b1 : + (prefill_lvl <= (reg_stat ? valid_cnt : next_valid_cnt)) ? 1'b0 : prefilling_d_int; + +assign next_data_avail_d_int = ((dw_sync_event_vec[rd_ptr_d] === 1'bX) || (next_prefilling_d_int === 1'bX)) ? 1'bX : + (next_prefilling_d_int === 1'b0) && (detect_lvl === dw_sync_event_vec[rd_ptr_d]) ? 1'b1 : 1'b0; + +assign next_data_d_int = (next_data_avail_d_int === 1'bX) ? {width{1'bX}} : + (next_data_avail_d_int === 1'b1) ? data_mem[rd_ptr_d] : data_d_int; + + + always @(posedge clk_s or negedge rst_s_n) begin : a1003_PROC + if (rst_s_n == 1'b0) begin + wr_ptr_s <= {cnt_depth{1'b0}}; + event_vec_s <= {depth{1'b0}}; + end else begin + if ((init_s_n == 1'b0) || (clr_in_prog_s == 1'b1)) begin + wr_ptr_s <= {cnt_depth{1'b0}}; + event_vec_s <= {depth{1'b0}}; + end else begin + wr_ptr_s <= next_wr_ptr_s; + event_vec_s <= next_event_vec_s; + end + end + end + + always @(posedge clk_d or negedge rst_d_n) begin : a1004_PROC + if (rst_d_n == 1'b0) begin + rd_ptr_d <= {cnt_depth{1'b0}}; + valid_cnt <= {cnt_depth{1'b0}}; + detect_lvl <= 1'b1; + data_avail_d_int <= 1'b0; + data_d_int <= {width{1'b0}}; + prefilling_d_int <= 1'b0; + end else begin + if ((init_d_n == 1'b0) || (clr_in_prog_d == 1'b1)) begin + rd_ptr_d <= {cnt_depth{1'b0}}; + valid_cnt <= {cnt_depth{1'b0}}; + detect_lvl <= 1'b1; + data_avail_d_int <= 1'b0; + data_d_int <= {width{1'b0}}; + prefilling_d_int <= 1'b0; + end else begin + rd_ptr_d <= next_rd_ptr_d; + valid_cnt <= next_valid_cnt; + detect_lvl <= next_detect_lvl; + data_avail_d_int <= next_data_avail_d_int; + data_d_int <= next_data_d_int; + prefilling_d_int <= next_prefilling_d_int; + end + end + end + + assign data_avail_d = data_avail_d_int; + assign data_d = data_d_int; + assign prefilling_d = prefilling_d_int; + + + + always @ (clk_s) begin : monitor_clk_s + if ( (clk_s !== 1'b0) && (clk_s !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_s input.", + $time, clk_s ); + end // monitor_clk_s + + always @ (clk_d) begin : monitor_clk_d + if ( (clk_d !== 1'b0) && (clk_d !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_d input.", + $time, clk_d ); + end // monitor_clk_d + +// synopsys translate_on +endmodule +/* vcs gen_ip dbg_ip off */ + /* */ \ No newline at end of file diff --git a/DA4008_V1.2/model/DW_sync.v b/DA4008_V1.2/model/DW_sync.v new file mode 100644 index 0000000..1d9c5f8 --- /dev/null +++ b/DA4008_V1.2/model/DW_sync.v @@ -0,0 +1,385 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Synopsys Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2005 - 2018 SYNOPSYS INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +// AUTHOR: Doug Lee 3/3/05 +// +// VERSION: Simulation Architecture +// +// DesignWare_version: c5e9837c +// DesignWare_release: O-2018.06-DWBB_201806.1 +// +//////////////////////////////////////////////////////////////////////////////// +// +// ABSTRACT: Fundamental Synchronizer Simulation Model +// +// This synchronizes incoming data into the destination domain +// with a configurable number of sampling stages. +// +// Parameters: Valid Values +// ========== ============ +// width [ 1 to 1024 ] +// f_sync_type [ 0 = single clock design, no synchronizing stages implemented, +// 1 = 2-stage synchronization w/ 1st stage neg-edge & 2nd stage pos-edge capturing, +// 2 = 2-stage synchronization w/ both stages pos-edge capturing, +// 3 = 3-stage synchronization w/ all stages pos-edge capturing, +// 4 = 4-stage synchronization w/ all stages pos-edge capturing ] +// tst_mode [ 0 = no hold latch inserted, +// 1 = insert hold 'latch' using a neg-edge triggered register +// 2 = reserved (functions same as tst_mode=0 ] +// verif_en [ 0 = no sampling errors inserted, +// 1 = sampling errors are randomly inserted with 0 or 1 destination clock cycle delays +// 2 = sampling errors are randomly inserted with 0, 0.5, 1, or 1.5 destination clock cycle delays +// 3 = sampling errors are randomly inserted with 0, 1, 2, or 3 destination clock cycle delays +// 4 = sampling errors are randomly inserted with 0 or up to 0.5 destination clock cycle delays ] +// +// Input Ports: Size Description +// =========== ==== =========== +// clk_d 1 bit Destination Domain Input Clock +// rst_d_n 1 bit Destination Domain Active Low Async. Reset +// init_d_n 1 bit Destination Domain Active Low Sync. Reset +// data_s N bits Source Domain Data Input +// test 1 bit Test input +// +// Output Ports Size Description +// ============ ==== =========== +// data_d N bits Destination Domain Data Output +// +// Note: the value of N is equal to the 'width' parameter value +// +// +// MODIFIED: +// RJK 09-17-13 updated to eliminate race (STAR 9000661688) +// RJK 01-15-13 updated to eliminate `define +// RJK 10-11-12 corrected test mode behavior when tst_mode=2 +// DLL 8-8-11 Added tst_mode=2 (not a functional change) +// DLL 6-12-06 Removed unnecessary To_X01 processing of 'data_s_int' +// +// DLL 11-7-06 Modified functionality to support f_sync_type = 4 +// +// DLL 11-14-06 Revised approach to routing missampling of data_s +// +// +// DLL 8-18-10 Fixed typo that results in correct resolution of 'data_s_delta_t' +// in the missampling code. Addresses STAR#9000412693. + +module DW_sync ( + clk_d, + rst_d_n, + init_d_n, + data_s, + test, + data_d + ); + +parameter integer width = 8; +parameter integer f_sync_type = 2; +parameter integer tst_mode = 0; +parameter integer verif_en = 1; + +input clk_d; +input rst_d_n; +input init_d_n; +input [width-1:0] data_s; +input test; +output [width-1:0] data_d; + +// synopsys translate_off +localparam F_SYNC_TYPE_INT = f_sync_type % 8; + + //------------------------------------------------------------------------- + // Parameter legality check + //------------------------------------------------------------------------- + + + initial begin : parameter_check + integer param_err_flg; + + param_err_flg = 0; + + + if (width < 1 ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter width (lower bound: 1 )", + width ); + end + + if ( (F_SYNC_TYPE_INT < 0) || (F_SYNC_TYPE_INT > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter F_SYNC_TYPE_INT (legal range: 0 to 4)", + F_SYNC_TYPE_INT ); + end + + if ( (verif_en < 0) || (verif_en > 4) ) begin + param_err_flg = 1; + $display( + "ERROR: %m :\n Invalid value (%d) for parameter verif_en (legal range: 0 to 4)", + verif_en ); + end + + if ( param_err_flg == 1) begin + $display( + "%m :\n Simulation aborted due to invalid parameter value(s)"); + $finish; + end + + end // parameter_check + + + wire [width-1:0] data_s_int; + reg [width-1:0] ndata1_int; + reg [width-1:0] data1_int; + reg [width-1:0] data_d2_int; + reg [width-1:0] data_d3_int; + reg [width-1:0] data_d4_int; + reg [width-1:0] test_nout1_int; + + wire [width-1:0] next_data1_int; + wire [width-1:0] next_data_d2_int; + wire [width-1:0] next_data_d3_int; + wire [width-1:0] tst_mode_sel_data; + wire [width-1:0] f_sync_type0_data; + + + `ifdef DW_MODEL_MISSAMPLES + + + + + + initial begin + $display("Information: %m: *** Running with DW_MODEL_MISSAMPLES defined, verif_en is: %0d ***", + verif_en); + end + +reg [width-1:0] test_hold_ms; +wire hclk_odd; +reg [width-1:0] last_data_dyn, data_s_delta_t; +reg [width-1:0] last_data_s, last_data_s_q, last_data_s_qq; +wire [width-1:0] data_s_sel_0, data_s_sel_1; +reg [width-1:0] data_select; initial data_select = 0; +reg [width-1:0] data_select_2; initial data_select_2 = 0; + + always @ (negedge clk_d or negedge rst_d_n) begin : PROC_test_hold_ms_registers + if (rst_d_n == 1'b0) begin + test_hold_ms <= {width{1'b0}}; + end else if (init_d_n == 1'b0) begin + test_hold_ms <= {width{1'b0}}; + end else begin + test_hold_ms <= data_s; + end + end +reg init_dly_n; + + + always @ (posedge hclk_odd or data_s or rst_d_n) begin : PROC_catch_last_data + data_s_delta_t <= (data_s | (data_s ^ data_s)) & {width{rst_d_n}} & {width{init_dly_n}}; + last_data_dyn <= data_s_delta_t & {width{rst_d_n}} & {width{init_dly_n}}; + end // PROC_catch_last_data + +generate if ((verif_en % 2) == 1) begin : GEN_HO_VE_EVEN + assign hclk_odd = clk_d; +end else begin : GEN_HO_VE_ODD + assign hclk_odd = ~clk_d; +end +endgenerate + + always @ (posedge clk_d or negedge rst_d_n) begin : PROC_missample_hist_even + if (rst_d_n == 1'b0) begin + last_data_s_q <= {width{1'b0}}; + init_dly_n <= 1'b1; + end else if (init_d_n == 1'b0) begin + last_data_s_q <= {width{1'b0}}; + init_dly_n <= 1'b0; + end else begin + last_data_s_q <= last_data_s; + init_dly_n <= 1'b1; + end + end // PROC_missample_hist_even + + always @ (posedge hclk_odd or negedge rst_d_n) begin : PROC_missample_hist_odd + if (rst_d_n == 1'b0) begin + last_data_s <= {width{1'b0}}; + last_data_s_qq <= {width{1'b0}}; + end else if (init_d_n == 1'b0) begin + last_data_s <= {width{1'b0}}; + last_data_s_qq <= {width{1'b0}}; + end else begin + last_data_s <= (data_s | (data_s ^ data_s)); + last_data_s_qq <= last_data_s_q; + end + end // PROC_missample_hist_odd + + always @ (data_s or last_data_s) begin : PROC_mk_next_data_select + if (data_s != last_data_s) begin + data_select = wide_random(width); + + if ((verif_en == 2) || (verif_en == 3)) + data_select_2 = wide_random(width); + else + data_select_2 = {width{1'b0}}; + end + end // PROC_mk_next_data_select + + assign data_s_sel_0 = (verif_en < 1)? data_s : ((data_s & ~data_select) | (last_data_dyn & data_select)); + + assign data_s_sel_1 = (verif_en < 2)? {width{1'b0}} : ((last_data_s_q & ~data_select) | (last_data_s_qq & data_select)); + + assign data_s_int = ((data_s_sel_0 & ~data_select_2) | (data_s_sel_1 & data_select_2)); + + + function [width-1:0] wide_random; + input [31:0] in_width; // should match "width" parameter -- need one input to satisfy Verilog function requirement + + reg [width-1:0] temp_result; + reg [31:0] rand_slice; + integer i, j, base; + + + begin + temp_result = $random; + if (((width / 32) + 1) > 1) begin + for (i=1 ; i < ((width / 32) + 1) ; i=i+1) begin + base = i << 5; + rand_slice = $random; + for (j=0 ; ((j < 32) && (base+j < in_width)) ; j=j+1) begin + temp_result[base+j] = rand_slice[j]; + end + end + end + + wide_random = temp_result; + end + endfunction // wide_random + + initial begin : seed_random_PROC + integer seed, init_rand; + `ifdef DW_MISSAMPLE_SEED + seed = `DW_MISSAMPLE_SEED; + `else + seed = 32'h0badbeef; + `endif + + init_rand = $random(seed); + end // seed_random_PROC + + + + + + + + `else + assign data_s_int = (data_s | (data_s ^ data_s)); + `endif + + + initial begin + if ((f_sync_type > 0)&&(f_sync_type < 8)) + $display("Information: *** Instance %m is the DW_sync Clock Domain Crossing Module ***"); + end + +`ifdef DW_REPORT_SYNC_PARAMS + initial begin + if (F_SYNC_TYPE_INT > 0) + $display("Information: *** Instance %m is configured as follows: width is: %0d, f_sync_type is: %0d, tst_mode is: %0d ***", width, F_SYNC_TYPE_INT, tst_mode); + end +`endif + + + assign tst_mode_sel_data = (tst_mode == 1) ? test_nout1_int : data_s; + + assign f_sync_type0_data = (test == 1'b1) ? tst_mode_sel_data : data_s; + + assign next_data1_int = (test == 1'b0) ? data_s_int : tst_mode_sel_data; + + + generate + if ((f_sync_type & 7) == 1) begin : GEN_NXT_SMPL_SM1_FST_EQUAL1 + assign next_data_d2_int = ndata1_int; + end + if ((f_sync_type & 7) > 1) begin : GEN_NXT_SMPL_SM1_FST_GRTH1 + assign next_data_d2_int = data1_int; + end + endgenerate + + always @(negedge clk_d or negedge rst_d_n) begin : a1000_PROC + if (rst_d_n === 1'b0) begin + ndata1_int <= {width{1'b0}}; + test_nout1_int <= {width{1'b0}}; + end else if (rst_d_n === 1'b1) begin + if (init_d_n === 1'b0) begin + ndata1_int <= {width{1'b0}}; + test_nout1_int <= {width{1'b0}}; + end else if (init_d_n === 1'b1) begin + ndata1_int <= data_s_int; + test_nout1_int <= data_s; + end else begin + ndata1_int <= {width{1'bX}}; + test_nout1_int <= {width{1'bX}}; + end + end else begin + ndata1_int <= {width{1'bX}}; + test_nout1_int <= {width{1'bX}}; + end + end + + always @(posedge clk_d or negedge rst_d_n) begin : a1001_PROC + if (rst_d_n === 1'b0) begin + data1_int <= {width{1'b0}}; + data_d2_int <= {width{1'b0}}; + data_d3_int <= {width{1'b0}}; + data_d4_int <= {width{1'b0}}; + end else if (rst_d_n === 1'b1) begin + if (init_d_n === 1'b0) begin + data1_int <= {width{1'b0}}; + data_d2_int <= {width{1'b0}}; + data_d3_int <= {width{1'b0}}; + data_d4_int <= {width{1'b0}}; + end else if (init_d_n === 1'b1) begin + data1_int <= next_data1_int; + data_d2_int <= next_data_d2_int; + data_d3_int <= data_d2_int; + data_d4_int <= data_d3_int; + end else begin + data1_int <= {width{1'bX}}; + data_d2_int <= {width{1'bX}}; + data_d3_int <= {width{1'bX}}; + data_d4_int <= {width{1'bX}}; + end + end else begin + data1_int <= {width{1'bX}}; + data_d2_int <= {width{1'bX}}; + data_d3_int <= {width{1'bX}}; + data_d4_int <= {width{1'bX}}; + end + end + + assign data_d = (F_SYNC_TYPE_INT == 0) ? f_sync_type0_data : + (F_SYNC_TYPE_INT == 3) ? data_d3_int : + (F_SYNC_TYPE_INT == 4) ? data_d4_int : + data_d2_int; + + + + always @ (clk_d) begin : monitor_clk_d + if ( (clk_d !== 1'b0) && (clk_d !== 1'b1) && ($time > 0) ) + $display( "WARNING: %m :\n at time = %t, detected unknown value, %b, on clk_d input.", + $time, clk_d ); + end // monitor_clk_d + + +// synopsys translate_on +endmodule +/* vcs gen_ip dbg_ip off */ + /* */ diff --git a/DA4008_V1.2/model/LVDS_DRIVER.sv b/DA4008_V1.2/model/LVDS_DRIVER.sv new file mode 100644 index 0000000..307bb27 --- /dev/null +++ b/DA4008_V1.2/model/LVDS_DRIVER.sv @@ -0,0 +1,475 @@ +/////////////////////////////////////////////////////////////////////////////// +// LVDS_DRIVER.sv +// Enhanced LVDS Driver (4 lanes, 8 clock cycles per word) +// Reads a 32-bit data word from a text file and sends it, providing LVDS interface driving +// New features: automatic frame header detection, dynamic scrambler mask, CRC32 calculation, TXT frame integrity check +// Added training sequence support (configurable pattern count) +// Added option to ignore CRC errors (ignore_crc_error) +/////////////////////////////////////////////////////////////////////////////// + +`ifndef LVDS_DRIVER_SV +`define LVDS_DRIVER_SV + +//------------------------------------------------------------------------- +// LVDS interface definition +//------------------------------------------------------------------------- +interface lvds_if (input bit clk); + logic valid; // Data valid indication + logic [3:0] data; // Data on 4 lanes +endinterface + +//------------------------------------------------------------------------- +// DataReader class: Reads 32-bit hexadecimal data from a file and stores it in MSB-first queue +//------------------------------------------------------------------------- +class DataReader; + + bit spi_data_queue[$]; // Bit-level queue (MSB first) + + function void read_txt_file(input string filename); + int file_id; + string line; + bit [31:0] value; + int i; + + file_id = $fopen(filename, "r"); + if (file_id == 0) begin + $display("Error: Failed to open file %s", filename); + return; + end + + while (!$feof(file_id)) begin + $fscanf(file_id, "%h\n", value); + // Store the 32-bit word into queue MSB first + for (i = 31; i >= 0; i--) begin + spi_data_queue.push_back(value[i]); + end + end + + $fclose(file_id); + endfunction + + function void get_data_queue(ref bit data_queue[$]); + data_queue = spi_data_queue; + spi_data_queue.delete(); + endfunction + +endclass + +//------------------------------------------------------------------------- +// lvds_item class: Encapsulates a set of 32-bit data words +//------------------------------------------------------------------------- +class lvds_item; + + // Data word queue (each element 32 bits) + bit [31:0] data[$]; + + function new(string name = "lvds_item"); + endfunction + + // Unpack from bit stream (MSB first) + function void unpack(ref bit stream[$]); + bit [31:0] word; + data.delete(); + while (stream.size() >= 32) begin + for (int i = 0; i < 32; i++) begin + word[31-i] = stream.pop_front(); + end + data.push_back(word); + end + endfunction + + // Pack to bit stream (MSB first) + function void pack(ref bit stream[$]); + foreach (data[i]) begin + for (int j = 31; j >= 0; j--) begin + stream.push_back(data[i][j]); + end + end + endfunction + + // Print item content (debug) + function void print(); + $display("LVDS Item: %0d words", data.size()); + foreach (data[i]) begin + $display(" data[%0d] = %h", i, data[i]); + end + endfunction + +endclass + +//------------------------------------------------------------------------- +// lvds_driver class: LVDS driver, supports file-driven, TB-compatible direct sending, and scrambling +//------------------------------------------------------------------------- +class lvds_driver; + + // Original members + string file_path; // Data file path + virtual lvds_if drv_if; // Virtual interface + int interval = 0; // Inter-word gap (clock cycles), 0 means continuous transmission + int clk_period = 1600; // Clock period (ps), used only for debug + + // Scrambler related members + bit [31:0] lfsr_lane[0:3]; // Independent LFSR states for 4 lanes + bit scrambler_en = 0; // Global scrambler enable (if set, scrambling is automatically applied during transmission) + bit [3:0] scrambler_mask = 4'b1111; // Default scrambler mask, 1 indicates that lane is scrambled + + // Frame header auto-detection related + bit [31:0] frame_header = 32'hBCBCBCBC; // Default frame header + bit auto_detect_header = 1; // Whether to auto-detect header and adjust mask + + // Frame integrity check enable + bit enable_frame_check = 1; // Whether to perform frame validation on file content before transmission + bit ignore_crc_error = 1; // If set, CRC errors will be warnings (not fatal) + + // Training related constants and variables + const bit [31:0] TRAINING_PATN = 32'h68666E6C; // "hfnl" + const bit [31:0] TRAINING_EXIT = 32'h65786974; // "exit" + int train_count = 10; // Number of training pattern blocks to send (can be configured) + + function new(string name = "lvds_driver"); + // Initialize LFSR (default uses SCRAMBLER_SEED = 32'hFFFFFFFF) + for (int i = 0; i < 4; i++) lfsr_lane[i] = 32'hFFFFFFFF; + endfunction + + //------------------------------------------------------------------------- + // Send a 32-bit word (fully compatible with TB approach) + // Place the word on lane0, other lanes constant 0, send MSB first over 32 clocks + //------------------------------------------------------------------------- + local task send_word(bit [31:0] word); + for (int i = 31; i >= 0; i--) begin + @(posedge drv_if.clk); + drv_if.valid <= 1'b1; + drv_if.data[0] <= word[i]; + drv_if.data[3:1] <= 3'b0; + end + endtask + + //------------------------------------------------------------------------- + // Send an lvds_item (internally calls send_word) + // Note: This method sends only one word on lane0 each time; for parallel transmission use send_words family tasks + //------------------------------------------------------------------------- + task send(lvds_item item); + foreach (item.data[i]) begin + send_word(item.data[i]); + repeat (interval) @(posedge drv_if.clk); + end + @(posedge drv_if.clk); + drv_if.valid <= 1'b0; + drv_if.data <= 4'b0; + endtask + + //------------------------------------------------------------------------- + // Send a 128-bit block, fully compatible with TB's send_block (MSB first) + //------------------------------------------------------------------------- + task send_block(input [127:0] block); + for (int i = 31; i >= 0; i--) begin + @(posedge drv_if.clk); + drv_if.valid <= 1'b1; + drv_if.data[0] <= block[i]; + drv_if.data[1] <= block[32 + i]; + drv_if.data[2] <= block[64 + i]; + drv_if.data[3] <= block[96 + i]; + end + endtask + + //------------------------------------------------------------------------- + // Send multiple identical 128-bit blocks consecutively + //------------------------------------------------------------------------- + task send_blocks(input [127:0] block, input int count); + repeat (count) send_block(block); + endtask + + //------------------------------------------------------------------------- + // Send a sequence of 32-bit words (automatically pack into 128-bit blocks, zero-pad if needed) + // Parameter words is an array, num_words is the actual number of words (up to 256) + //------------------------------------------------------------------------- + task send_words(input int num_words, input [31:0] words[0:255]); + int word_idx; + int j; + reg [127:0] block; + + word_idx = 0; + while (word_idx < num_words) begin + block = 128'h0; + for (j = 0; j < 4; j++) begin + if (word_idx < num_words) begin + block[32*j +: 32] = words[word_idx]; + word_idx++; + end + end + send_block(block); + end + endtask + + //------------------------------------------------------------------------- + // Initialize LFSR (all lanes use the same seed) + //------------------------------------------------------------------------- + function void init_scrambler(bit [31:0] seed); + for (int i = 0; i < 4; i++) lfsr_lane[i] = seed; + endfunction + + //------------------------------------------------------------------------- + // Update a single LFSR (polynomial: x^32 + x^30 + x^29 + x^28 + 1) + //------------------------------------------------------------------------- + function bit [31:0] lfsr_update(bit [31:0] lfsr); + bit feedback; + feedback = lfsr[31] ^ lfsr[30] ^ lfsr[29] ^ lfsr[28]; + lfsr_update = {lfsr[30:0], feedback}; + endfunction + + //------------------------------------------------------------------------- + // Scramble a single 128-bit block with lane mask support + // Input original: original block; mask: whether each lane is scrambled (1=scramble) + // Output scrambled: scrambled block + // Note: This method updates the internal LFSR state (only for lanes that are scrambled) + //------------------------------------------------------------------------- + function void scramble_block_masked(input [127:0] original, input [3:0] mask, output [127:0] scrambled); + bit [31:0] lane_word; + scrambled = 128'h0; + for (int i = 0; i < 4; i++) begin + lane_word = original[32*i +: 32]; + if (mask[i]) begin + scrambled[32*i +: 32] = lane_word ^ lfsr_lane[i]; + lfsr_lane[i] = lfsr_update(lfsr_lane[i]); // Update LFSR only for scrambled lanes + end else begin + scrambled[32*i +: 32] = lane_word; + end + end + endfunction + + //------------------------------------------------------------------------- + // Send a scrambled 128-bit block (using current scrambler_en and scrambler_mask) + // If scrambler_en is 0, directly send the original block (same as send_block) + //------------------------------------------------------------------------- + task send_block_scrambled(input [127:0] block); + if (scrambler_en) begin + logic [127:0] scrambled; + scramble_block_masked(block, scrambler_mask, scrambled); + send_block(scrambled); + end else begin + send_block(block); + end + endtask + + //------------------------------------------------------------------------- + // Send a sequence of scrambled 32-bit words (using fixed scrambler_mask) + //------------------------------------------------------------------------- + task send_words_scrambled(input int num_words, input [31:0] words[0:255]); + int word_idx; + int j; + reg [127:0] block; + + word_idx = 0; + while (word_idx < num_words) begin + block = 128'h0; + for (j = 0; j < 4; j++) begin + if (word_idx < num_words) begin + block[32*j +: 32] = words[word_idx]; + word_idx++; + end + end + send_block_scrambled(block); + end + endtask + + //------------------------------------------------------------------------- + // Frame check function, verifies if words form a valid frame (header, length, CRC) + // Returns 1 for pass, 0 for fail, err_msg outputs error information + //------------------------------------------------------------------------- + static function bit check_frame(bit [31:0] words[$], ref string err_msg); + int num_words = words.size(); + bit [31:0] header, addr_len, crc_expected, crc_computed; + int data_len; + bit [31:0] data_words[0:255]; // For CRC calculation + int i; + + // Basic length check: at least 3 words (header, addr/len, CRC) + if (num_words < 3) begin + err_msg = "Frame word count less than 3"; + return 0; + end + + header = words[0]; + if (header !== 32'hBCBCBCBC) begin + err_msg = $sformatf("Frame header error, expected 32'hBCBCBCBC, got 32'h%h", header); + return 0; + end + + addr_len = words[1]; + data_len = addr_len[15:0]; // Lower 16 bits are data length + // Verify total word count: 1(header) + 1(addr/len) + data_len + 1(CRC) = 3 + data_len + if (num_words != 3 + data_len) begin + err_msg = $sformatf("Frame length mismatch: expected %0d words from length field, got %0d words", 3+data_len, num_words); + return 0; + end + + // Collect data part (addr_len word + data words) for CRC calculation + // Note: CRC range is from words[1] to words[1+data_len-1] (total 1+data_len words) + for (i = 0; i < 1+data_len; i++) begin + data_words[i] = words[1 + i]; + end + crc_computed = crc32_compute(data_words, 1+data_len); + crc_expected = words[2+data_len]; // CRC word + + if (crc_computed !== crc_expected) begin + err_msg = $sformatf("CRC error: computed 32'h%h, expected 32'h%h", crc_computed, crc_expected); + return 0; + end + + err_msg = "Frame check passed"; + return 1; + endfunction + + //------------------------------------------------------------------------- + // Read complete frame data from file, auto-detect frame header and dynamically adjust scrambler mask + // The lane containing the frame header is not scrambled, other lanes are scrambled; all subsequent blocks are fully scrambled + // Perform frame integrity check before transmission (if enable_frame_check is 1) + //------------------------------------------------------------------------- + task send_frame_from_file(string filename); + DataReader reader = new(); + bit bit_stream[$]; + lvds_item item = new(); + string err_msg; + reader.read_txt_file(filename); + reader.get_data_queue(bit_stream); + item.unpack(bit_stream); + + // Frame check + if (enable_frame_check) begin + if (!check_frame(item.data, err_msg)) begin + if (ignore_crc_error) begin + $warning("Frame check warning: %s, file %s (ignored)", err_msg, filename); + end else begin + $error("Frame check failed: %s, file %s", err_msg, filename); + return; // Stop transmission + end + end else begin + $display("Frame check passed: %s", err_msg); + end + end + + send_words_scrambled_auto(item.data); + endtask + + //------------------------------------------------------------------------- + // Send word queue, auto-detect frame header and dynamically adjust scrambler mask + // If auto_detect_header is 0 or scrambler_en is 0, use fixed mask (scrambler_mask) + // Otherwise, detect per block; when header is encountered, set that lane mask to 0, subsequent blocks all 1 + //------------------------------------------------------------------------- + task send_words_scrambled_auto(bit [31:0] words[$]); + int word_idx; + int block_idx; + bit header_found; + reg [127:0] block; + bit [3:0] mask; + int num; + bit [31:0] words_arr[0:255]; + + if (!scrambler_en || !auto_detect_header) begin + // Fallback to fixed mask transmission + num = words.size(); + foreach (words[i]) words_arr[i] = words[i]; + send_words_scrambled(num, words_arr); + return; + end + + // Auto-detection mode + word_idx = 0; + block_idx = 0; + header_found = 0; + + while (word_idx < words.size()) begin + // Pack current block (up to 4 words) + block = 128'h0; + for (int j = 0; j < 4; j++) begin + if (word_idx < words.size()) begin + block[32*j +: 32] = words[word_idx]; + word_idx++; + end + end + + // Determine scrambler mask for current block + if (!header_found) begin + mask = 4'b1111; // Default all scrambled + // Check if current block contains the frame header + for (int j = 0; j < 4; j++) begin + if (word_idx - 4 + j < words.size()) begin // Ensure index is valid + if (block[32*j +: 32] == frame_header) begin + mask[j] = 1'b0; // Lane containing header is not scrambled + header_found = 1; + // Note: Even if multiple headers appear in one block (theoretically impossible), we handle only the first + end + end + end + end else begin + mask = 4'b1111; // Header already found, subsequent blocks all scrambled + end + + // Send current block (scrambled according to mask) + if (scrambler_en) begin + logic [127:0] scrambled; + scramble_block_masked(block, mask, scrambled); + send_block(scrambled); + end else begin + send_block(block); + end + block_idx++; + end + endtask + + //------------------------------------------------------------------------- + // Main driving task: Read data from file and send (using full parallel 128-bit scrambled transmission) + // Automatically detect frame header and apply scrambler mask (if scrambler enabled) + //------------------------------------------------------------------------- + task do_drive(); + send_frame_from_file(file_path); + endtask + + //------------------------------------------------------------------------- + // Send training sequence: train_count blocks of TRAINING_PATN, then one block of TRAINING_EXIT + // Optionally disable scrambling during training + //------------------------------------------------------------------------- + task send_training(); + bit [127:0] train_block = {4{TRAINING_PATN}}; + bit [127:0] exit_block = {4{TRAINING_EXIT}}; + bit prev_scrambler_en = scrambler_en; + scrambler_en = 0; // Training patterns are not scrambled + send_blocks(train_block, train_count); + send_block(exit_block); + scrambler_en = prev_scrambler_en; + endtask + + //------------------------------------------------------------------------- + // Optional: Combined task to send training then data frame + //------------------------------------------------------------------------- + task send_training_and_data(string filename); + send_training(); + send_frame_from_file(filename); + endtask + + //------------------------------------------------------------------------- + // CRC32 calculation functions (polynomial 0x04C11DB7, initial value 0xFFFFFFFF) + //------------------------------------------------------------------------- + static function automatic bit [31:0] crc32_next(input bit [31:0] crc, input bit [31:0] data); + bit [31:0] new_crc; + bit b; + new_crc = crc; + for (int i = 0; i < 32; i++) begin + b = new_crc[31] ^ data[31-i]; + new_crc = {new_crc[30:0], 1'b0}; + if (b) new_crc = new_crc ^ 32'h04C11DB7; + end + return new_crc; + endfunction + + static function automatic bit [31:0] crc32_compute(input bit [31:0] words[0:255], input int num); + bit [31:0] crc = 32'hFFFFFFFF; + for (int i = 0; i < num; i++) begin + crc = crc32_next(crc, words[i]); + end + return crc; + endfunction + +endclass + +`endif // LVDS_DRIVER_SV diff --git a/DA4008_V1.2/model/SPI_DRIVER.sv b/DA4008_V1.2/model/SPI_DRIVER.sv new file mode 100644 index 0000000..8e38075 --- /dev/null +++ b/DA4008_V1.2/model/SPI_DRIVER.sv @@ -0,0 +1,424 @@ +//top-class : spi_driver +//parameter : file_path: the path of *.txt file +// itf: spi interface (type==spi_if) +// half_sclk(option): =(half period of sclk)/(period of clk), default 5 +// interval(option): the time to wait between the adjacent W/R operation/(period of clk), defaut 10 +//example case : +/* spi_driver my_drv; + + initial begin + + my_drv = new(); + + my_drv.file_path = "./../cfgdata/enveindex/wave_index_13.txt"; + my_drv.itf = my_if; + my_drv.half_sclk = 10; + my_drv.interval = 50; + + my_drv.do_drive(); + + end//*/ + +class BinaryDataReader; + + // data_stream + bit spi_data_queue[$]; + int cmd_head[$]; + + // open & read txt_file + function void read_txt_file(input string filename); + int file_id; + string line; + bit [31:0] value; + int i; + //int cmd_head[$]; + int length; + bit cmd; + int cnt; + + // open + file_id = $fopen(filename, "r"); + if (file_id == 0) begin + $display("Error: Failed to open file %s", filename); + return; + end + + cnt = 0; + // read + while (!$feof(file_id)) begin + //if ($fgets(line, file_id)) begin + $fscanf(file_id,"%h\n",value); + //$display("\nvalue = %h",value); + //$display("cnt = %h",cnt); + if(cnt == 0) begin + cmd = value[31]; + + if(cmd) cmd_head.push_back(value); + + cnt ++; + end + else if(cnt == 1) begin + if(cmd) cmd_head.push_back(value); + + length = value[15:0] / 4; + + if(!cmd) cnt ++; + else cnt = 0; + end + else if((cnt == length-1 +2) | cmd) begin + cnt = 0; + end + else begin + cnt ++; + end + //$display("cmd = %h",cmd); + //$display("length = %h",length); + //$display(cmd_head); + + for (i = 31; i >= 0; i--) begin + spi_data_queue.push_back(value[i]); + end + //end + end + + + // close + $fclose(file_id); + endfunction + + function void get_data_queue(ref bit data_queue[$]); + data_queue = spi_data_queue; + spi_data_queue.delete(); + endfunction + +endclass + +//---------------------------------------------------------------------- + +class spi_item; + + //Properties for Randomizing the MOSI + rand bit cmd; + rand bit[24:0] addr; + rand bit[ 4:0] cfgid; + rand bit[31:0] data[$]; + + //Properties for Randomizing the pkt_sent process + rand int interval; + rand int half_sclk; + + constraint cstr { + interval <= 1000; + half_sclk >= 5; + data.size >= 1; + data.size <= 10000; + } + + function new(string name="spi_item"); + endfunction : new + + extern function bit compare(spi_item rhs_); + extern function void print(); + extern function void fprint(integer fid); + extern function void trprint(integer fid, ref int cmd_head[$]); + extern function void unpack(ref bit stream[$]); + extern function void pack(bit stream[$]); + extern function void adapt( + ref bit stream[$] + , int half_sclk + , int interval + ); + +endclass : spi_item + + + +function bit spi_item::compare(spi_item rhs_); + bit result=1'b1; + int i=0; + + if(this.data.size() != rhs_.data.size()) begin + $display("data_sizes are different"); + result = 1'b0; + end + else begin + for(i=0;i0)begin + for(i=0;i<32;i++) + data_temp[31-i] = stream.pop_front(); + data.push_back(data_temp); + end + +endfunction + +function void spi_item::adapt(ref bit stream[$], int half_sclk, int interval); + int i=0; + bit[31:0] data_length=32'b0; + bit[31:0] data_temp=32'b0; + + cmd = stream.pop_front(); + + //reserved + stream.pop_front(); + + for(i=0;i<5;i++) + cfgid[4-i] = stream.pop_front(); + + for(i=0;i<25;i++) + addr[24-i] = stream.pop_front(); + + for(i=0;i<32;i++) + data_length[31-i] = stream.pop_front(); + data_length = {14'b0,data_length[19:2]}; + + repeat(data_length) begin + for(i=0;i<32;i++) + data_temp[31-i] = cmd ? 1'b0 : stream.pop_front(); + data.push_back(data_temp); + end + + this.half_sclk = half_sclk; + this.interval = interval; +endfunction + + +//----------------------------------------------------------------- + +class spi_driver; + + string file_path; + virtual spi_if itf; + int interval = 10; + int half_sclk = 5 ; + + spi_item m_trans; + + /*static string file_list[$]={ + "./../cfgdata/instrmem/awg_inst.txt" //0 + ,"./../cfgdata/instrmem/LongFlattop_bin.txt" //1 + ,"./../cfgdata/instrmem/LongFlattopAmpAdj_bin.txt" //2 + ,"./../cfgdata/instrmem/LongRectangle_bin.txt" //3 + ,"./../cfgdata/instrmem/LongRectangle50us_bin.txt" //4 + ,"./../cfgdata/instrmem/SingleWaveACCZ_bin.txt" //5 + ,"./../cfgdata/instrmem/SingleWaveCombine_bin.txt" //6 + ,"./../cfgdata/instrmem/SingleWaveCosine_bin.txt" //7 + ,"./../cfgdata/instrmem/SingleWaveFlattop_bin.txt" //8 + ,"./../cfgdata/instrmem/SingleWaveRectangle_bin.txt" //9 + ,"./../cfgdata/instrmem/WaveHold_bin.txt" //10 + ,"./../cfgdata/instrmem/Condition_bin.txt" //11 + ,"./../cfgdata/instrmem/RabiFreqAmp_bin.txt" //12 + ,"./../cfgdata/instrmem/WaveHoldSingle_bin.txt" //13 + ,"./../cfgdata/instrmem/Cosine9_bin.txt" //14 + //,"./../cfgdata/datamem/data_mem.txt" //15 + ,"./../cfgdata/datamem/Cosine9_data_bin.txt" //15 + //,"./../cfgdata/enveindex/enve_index.txt" //16 + ,"./../cfgdata/enveindex/wave_index_13.txt" //16 + //,"./../cfgdata/envemem/envelop_mem.txt" //17 + ,"./../cfgdata/envemem/wave_bin_13.txt" //17 + ,"./../cfgdata/envemem/rwave_bin_12.txt" //18 + };//*/ + + + function new(string name = "spi_seq"); + endfunction : new + + extern task send(ref spi_item pkt); + + task do_drive(integer o_file_path=0); + + BinaryDataReader reader = new(); + //spi_item m_trans; + bit stream[$]; + + reader.read_txt_file(file_path); + reader.get_data_queue(stream); + //$display(stream); + while(stream.size()>0) begin + //$display(stream.size()); + m_trans = new("m_trans"); + m_trans.adapt(stream,half_sclk,interval); + //m_trans.print(); + send(m_trans); + m_trans.print(); + if(o_file_path!=0) begin + //m_trans.fprint(o_file_path); + if(m_trans.cmd) begin + m_trans.trprint(o_file_path, reader.cmd_head); + end + end + end + endtask : do_drive + +endclass : spi_driver + + +task spi_driver::send(ref spi_item pkt); + bit drv_stream[$]; + bit clt_stream[$]; + int i=0,j=0; + int cs_time; + int hs = pkt.half_sclk; + + while(!itf.rstn) begin + itf.csn = 1'b1; + itf.sclk = 1'b1; + @(posedge itf.clk); + end + //$display("unpacking"); + //unpack into bitstream + pkt.unpack(drv_stream); + //$display(stream); + //$display("unpackend"); + //initialize chip_select and input_clk + itf.csn <= 1'b1; + itf.sclk <= 1'b1; + itf.mosi <= drv_stream[0]; + itf.cfgid <= pkt.cfgid; + @(posedge itf.clk); + itf.csn <= 1'b0; + itf.sclk <= 1'b1; + //$display("initialize end"); + //csn valid time: time for bitstream to be all sent + cs_time = drv_stream.size()*2*hs; + //$display(stream.size()); + //$display("drv_stream.size = %0d", drv_stream.size()); + //$display(cs_time); + //drive the stream onto interface + fork + //Make sclk + begin + for(j=0;j +[comment]: <> (Verilog template v0.03) + +## Project Information +| > | Project Name | > | File Name | +| :-: | :-: | :-: | :-: | +| > | TODO | > | TODO | +| **Engineer** | **Institution** | **Target Devices** | **Tool Versions** | +| Guo Cheng[^1] | USTC | XC6VLX240TFF1156 | Xilinx ISE 13.3 | +| **Dependencies** | > | > | TODO | +| **Descriptions** | > | > | TODO | +[^1]: Author E-mail: + +## Reversion Information +| Revision | Time | Comments | +| :-: | :-: | :-: | +| ==v0.01== | 2019-08-08T02:51:47.205Z | File Create | + +## Code Segments + */ + +/* HIDE```verilog{.line-numbers}*/ +`timescale 1ns / 1ps + +module reset_tb #( + parameter DELAY = 0, + parameter POLAR = 0, + parameter WIDTH = 4 + )( + output reset_out + ); + reg reset; + + initial begin + reset = !POLAR; + #DELAY reset = POLAR; + #WIDTH reset = !POLAR; + end + assign reset_out = reset; +endmodule +/* HIDE```*/ diff --git a/DA4008_V1.2/model/spi_if.sv b/DA4008_V1.2/model/spi_if.sv new file mode 100644 index 0000000..663ff6d --- /dev/null +++ b/DA4008_V1.2/model/spi_if.sv @@ -0,0 +1,14 @@ + + +interface spi_if(input bit clk,input bit rstn); + + logic sclk ; + logic csn ; + logic mosi ; + logic miso ; + logic[4 : 0] cfgid ; + +endinterface + + + diff --git a/DA4008_V1.2/rtl/awg/awg_ctrl.v b/DA4008_V1.2/rtl/awg/awg_ctrl.v new file mode 100644 index 0000000..57ce019 --- /dev/null +++ b/DA4008_V1.2/rtl/awg/awg_ctrl.v @@ -0,0 +1,158 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : awg_ctrl.v +// Department : +// Author : hdzhang +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 0.1 2026-02-28 hdzhang fifo-cmd controlled waveform output +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +module awg_ctrl ( + //system port + input clk // System Main Clock + ,input rst_n // Spi Reset active low + //sync signal + ,input start + //cmd fifo read signal + ,output cmd_fifo_rd_en + ,input [31 :0] cmd_fifo_data + ,input cmd_fifo_empty + //wave sram read signals + ,output sram_rd_en + ,output [12 :0] sram_rd_addr + ,input [511:0] sram_rd_data + //output to dem module + ,output [511:0] wave_data_out + ,output wave_valid_out + //state submit + ,output [2 :0] status + ,output wave_busy +); + +localparam IDLE = 3'b0, CMD = 3'd1, WAVE = 3'd2, HOLD = 3'd3; +wire [2 : 0] state_c; +wire wave_cnt_add, wave_cnt_end; +wire [4 : 0] wave_cnt_c; +wire hold_cnt_add, hold_cnt_end; +wire [30 : 0] hold_cnt_c; + +//wire cmd_fifo_has_empty = cmd_fifo_empty && cmd_fifo_rd_en; +// ------------------------------------------------------ +// -- state machine +// ------------------------------------------------------ +//jump conditions +wire ilde2cmd = (state_c == IDLE) && start; +wire cmd2wave = (state_c == CMD ) && ~cmd_fifo_data[31]; +wire cmd2hold = (state_c == CMD ) && cmd_fifo_data[31]; +wire wave2hold = (state_c == WAVE) && wave_cnt_end && cmd_fifo_data[31] && ~cmd_fifo_empty; +wire wave2idle = (state_c == WAVE) && wave_cnt_end && cmd_fifo_empty; +wire hold2wave = (state_c == HOLD) && hold_cnt_end && ~cmd_fifo_data[31] && ~cmd_fifo_empty; +wire hold2idle = (state_c == HOLD) && hold_cnt_end && cmd_fifo_empty; +//state_n +wire [2 : 0] state_n = ((state_c == IDLE) && ilde2cmd ) ? CMD : + ((state_c == CMD ) && cmd2wave ) ? WAVE : + ((state_c == CMD ) && cmd2hold ) ? HOLD : + ((state_c == WAVE) && wave2hold ) ? HOLD : + ((state_c == WAVE) && wave2idle ) ? IDLE : + ((state_c == HOLD) && hold2wave ) ? WAVE : + ((state_c == HOLD) && hold2idle ) ? IDLE : + state_c ; +//state_c +sirv_gnrl_dffr #(3) state_c_dffr (state_n, state_c, clk, rst_n); + +// ------------------------------------------------------ +// -- command decode +// ------------------------------------------------------ +assign cmd_fifo_rd_en = ((state_c == CMD) || wave_cnt_end || hold_cnt_end) && ~cmd_fifo_empty; +wire [4 : 0] cycle_num; +wire [12 : 0] base_addr; +wire [12 : 0] wave_leng; +wire [30 : 0] hold_leng; +sirv_gnrl_dfflr #( 5) cycle_num_dfflr (cmd_fifo_rd_en && ~cmd_fifo_data[31], cmd_fifo_data[30:26], cycle_num, clk, rst_n); +sirv_gnrl_dfflr #(13) base_addr_dfflr (cmd_fifo_rd_en && ~cmd_fifo_data[31], cmd_fifo_data[25:13], base_addr, clk, rst_n); +sirv_gnrl_dfflr #(13) wave_leng_dfflr (cmd_fifo_rd_en && ~cmd_fifo_data[31], cmd_fifo_data[12: 0], wave_leng, clk, rst_n); +sirv_gnrl_dfflr #(31) hold_leng_dfflr (cmd_fifo_rd_en && cmd_fifo_data[31], cmd_fifo_data[30: 0], hold_leng, clk, rst_n); + +// ------------------------------------------------------ +// -- wave memory address count +// ------------------------------------------------------ +wire [12 : 0] addr_cnt_c; +wire addr_cnt_add = (state_c == WAVE); +wire addr_cnt_end = addr_cnt_add && (addr_cnt_c == wave_leng - 1); +wire [12 : 0] addr_cnt_n = addr_cnt_end ? 13'h0 : + addr_cnt_add ? addr_cnt_c + 1'b1 : + addr_cnt_c ; +sirv_gnrl_dffr #(13) addr_cnt_c_dffr (addr_cnt_n, addr_cnt_c, clk, rst_n); + +// ------------------------------------------------------ +// -- wave repeat count +// ------------------------------------------------------ +assign wave_cnt_add = addr_cnt_end; +assign wave_cnt_end = wave_cnt_add && (wave_cnt_c == cycle_num - 1) && (cycle_num != 5'd0); +wire [4 : 0] wave_cnt_n = wave_cnt_end ? 5'h0 : + wave_cnt_add ? wave_cnt_c + 1'b1 : + wave_cnt_c ; +sirv_gnrl_dffr #( 5) wave_cnt_c_dffr (wave_cnt_n, wave_cnt_c, clk, rst_n); + +// ------------------------------------------------------ +// -- hold length count +// ------------------------------------------------------ +assign hold_cnt_add = (state_c == HOLD); +assign hold_cnt_end = hold_cnt_add && (hold_cnt_c == hold_leng - 1); +wire [30 : 0] hold_cnt_n = hold_cnt_end ? 5'h0 : + hold_cnt_add ? hold_cnt_c + 1'b1 : + hold_cnt_c ; +sirv_gnrl_dffr #(31) hold_cnt_c_dffr (hold_cnt_n, hold_cnt_c, clk, rst_n); + +// ------------------------------------------------------ +// -- read wave SRAM +// ------------------------------------------------------ +sirv_gnrl_dffr #(1) sram_rd_en_dffr ((state_c == WAVE), sram_rd_en, clk, rst_n); +sirv_gnrl_dffr #(13) sram_rd_addr_dffr (base_addr + addr_cnt_c, sram_rd_addr, clk, rst_n); + +wire last_sram_rd_en, last_wave_data_vld; +wire [7 : 0] last_rddata; +sirv_gnrl_dffr #(1) last_sram_rd_en_dffr (wave_cnt_end, last_sram_rd_en, clk, rst_n); +sirv_gnrl_dffr #(1) last_wave_data_dffr (last_sram_rd_en, last_wave_data_vld, clk, rst_n); +sirv_gnrl_dfflr #(8) last_rddata_dfflr (last_wave_data_vld, sram_rd_data[511:504], last_rddata, clk, rst_n); + +wire wave_vld, hold_vld_n, hold_vld; +sirv_gnrl_dffr #(1) wave_vld_dffr (sram_rd_en, wave_vld, clk, rst_n); +sirv_gnrl_dffr #(1) hold_vld_n_dffr ((state_c == HOLD), hold_vld_n, clk, rst_n); +sirv_gnrl_dffr #(1) hold_vld_dffr (hold_vld_n, hold_vld, clk, rst_n); + +wire [511: 0] wave_data = wave_vld ? sram_rd_data : + hold_vld ? {64{last_rddata}} : + 512'd0 ; + +sirv_gnrl_dffr #(1) wave_valid_dffr (wave_vld | hold_vld, wave_valid_out, clk, rst_n); +sirv_gnrl_dfflr #(512) wave_data_dfflr (wave_vld | hold_vld | wave_valid_out, wave_data, wave_data_out, clk, rst_n); + +//status +assign status = state_c; +assign wave_busy = (state_c == WAVE) || (state_c == HOLD); +endmodule diff --git a/DA4008_V1.2/rtl/awg/awg_top.sv b/DA4008_V1.2/rtl/awg/awg_top.sv new file mode 100644 index 0000000..af487bd --- /dev/null +++ b/DA4008_V1.2/rtl/awg/awg_top.sv @@ -0,0 +1,180 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : awg_top.v +// Department : +// Author : hdzhang +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 0.1 2026-03-01 hdzhang awg-top +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +module awg_top ( + //system port + input clk // System Main Clock + ,input rst_n // Spi Reset active low + ,input start + //----------------------------from spi----------------------------------------------------------- + //Wave storage read/write signal + //A-port + ,input [511:0] wave_awrdata + ,input [0 :0] wave_awren + ,input [12 :0] wave_arwaddr + ,input [63 :0] wave_awrmask + + //B-port + ,input [31 :0] wave_bwrdata + ,input [0 :0] wave_bwren + ,input [18 :0] wave_brwaddr + ,input [0 :0] wave_brden + ,output [31 :0] wave_brddata + //cmd fifo read-write signal + ,input [31 :0] cmd_fifo_bwrdata + ,input [0 :0] cmd_fifo_bwren + ,input [7 :0] cmd_fifo_brwaddr + ,input [0 :0] cmd_fifo_brden + ,output [31 :0] cmd_fifo_brddata + //----------------------------to system regfile------------------------------------------------------ + //CMD FIFO Empty & Full + ,output cmd_fifo_empty + ,output cmd_fifo_full + //AWG Ctrl Status + ,output [2 :0] status + ,output wave_busy + //----------------------------to DEM---------------------------------------------------------------- + ,output [511:0] wave_data_out + ,output wave_valid_out + ); + +wire start_r; +sirv_gnrl_dffr #(1) start_dffr (start, start_r, clk, rst_n); + +wire start_posedge = start && ~start_r; +wire sync_start; +sirv_gnrl_dffr #(1) sync_start_dffr (start_posedge, sync_start, clk, rst_n); + +wire cmd_fifo_rd_en ; +wire [31 :0] cmd_fifo_data ; +//wire cmd_fifo_empty ; +wire sram_rd_en ; +wire [12 :0] sram_rd_addr ; +wire [511:0] sram_rd_data ; + +awg_ctrl awg_ctrl_inst( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.start ( sync_start ) + ,.cmd_fifo_rd_en ( cmd_fifo_rd_en ) + ,.cmd_fifo_data ( cmd_fifo_data ) + ,.cmd_fifo_empty ( cmd_fifo_empty ) + ,.sram_rd_en ( sram_rd_en ) + ,.sram_rd_addr ( sram_rd_addr ) + ,.sram_rd_data ( sram_rd_data ) + ,.wave_data_out ( wave_data_out ) + ,.wave_valid_out ( wave_valid_out ) + ,.status ( status ) + ,.wave_busy ( wave_busy ) +); + +//wire cmd_fifo_full ; +wire cmd_fifo_almost_full ; +wire cmd_fifo_almost_empty; +wire cmd_fifo_prog_full ; +wire cmd_fifo_prog_empty ; +wire [5 :0] cmd_fifo_cnt ; + +syn_fwft_fifo #(.width(32), .depth(64), .prog_full_thre(32), .prog_empty_thre(16)) +cmd_fifo_inst( + .clk ( clk ) + ,.rst ( ~rst_n ) + ,.clr ( 1'b0 ) + ,.wr_en ( cmd_fifo_bwren ) + ,.rd_en ( cmd_fifo_rd_en ) + ,.din ( cmd_fifo_bwrdata ) + ,.dout ( cmd_fifo_data ) + ,.full ( cmd_fifo_full ) + ,.empty ( cmd_fifo_empty ) + ,.almost_full ( cmd_fifo_almost_full ) + ,.almost_empty ( cmd_fifo_almost_empty ) + ,.prog_full ( cmd_fifo_prog_full ) + ,.prog_empty ( cmd_fifo_prog_empty ) + ,.cnt ( cmd_fifo_cnt ) +); + +//------------------------------------------------------------------------------------------ +// wave sram +//------------------------------------------------------------------------------------------ +sram_if #(19, 32) wave_sram_muxin (clk); +sram_if #(19,512) wave_sram_muxout(clk); +assign wave_sram_muxin.addr = wave_brwaddr[18:0] ; +assign wave_sram_muxin.din = wave_bwrdata ; +assign wave_sram_muxin.wben = 4'b1111 ; +assign wave_sram_muxin.wren = wave_bwren ; +assign wave_sram_muxin.rden = wave_brden ; +assign wave_brddata = wave_sram_muxin.dout ; +sram_dmux_w #(.ADDR_WIDTH(19), .DATA_WIDTH_I(32), .DATA_WIDTH_O(512)) +U_sram_dmux_w( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.port_in ( wave_sram_muxin ) + ,.port_out ( wave_sram_muxout ) +); +//Wave Memory Clock + +wire [0 :0] Wave_PortClk = clk ; +//The wave storage A port is connected to the internal AWG controller +wire [18 :0] Wave_PortAAddr = wave_awren ? {wave_arwaddr[12:0],6'b0} : {sram_rd_addr[12:0],6'b0}; +wire [511 :0] Wave_PortADataIn = wave_awrdata ; +wire [0 :0] Wave_PortAWriteEnable = ~wave_awren ; +wire [0 :0] Wave_PortAChipEnable = ~wave_awren&~sram_rd_en ; +wire [512/8-1:0] Wave_PortAByteWriteEnable = ~wave_awrmask ; +wire [511 :0] Wave_PortADataOut ; +assign sram_rd_data = Wave_PortADataOut ; +//The B port of the wave storage connects to an external SPI bus decode +wire [18 :0] Wave_PortBAddr = wave_sram_muxout.addr[18:0] ; +wire [511 :0] Wave_PortBDataIn = wave_sram_muxout.din ; +wire [0 :0] Wave_PortBWriteEnable = ~wave_sram_muxout.wren & wave_sram_muxout.rden ; +wire [0 :0] Wave_PortBChipEnable = ~(wave_sram_muxout.wren | wave_sram_muxout.rden) ; +wire [512/8-1:0] Wave_PortBByteWriteEnable = ~wave_sram_muxout.wben ; +wire [511 :0] Wave_PortBDataOut ; +assign wave_sram_muxout.dout = Wave_PortBDataOut ; + +dpram #(.DATAWIDTH(512), .ADDRWIDTH(19)) wave_dpram( + .PortClk ( Wave_PortClk ) + ,.PortAAddr ( Wave_PortAAddr ) + ,.PortADataIn ( Wave_PortADataIn ) + ,.PortAWriteEnable ( Wave_PortAWriteEnable ) + ,.PortAChipEnable ( Wave_PortAChipEnable ) + ,.PortAByteWriteEnable ( Wave_PortAByteWriteEnable ) + ,.PortADataOut ( Wave_PortADataOut ) + ,.PortBAddr ( Wave_PortBAddr ) + ,.PortBDataIn ( Wave_PortBDataIn ) + ,.PortBWriteEnable ( Wave_PortBWriteEnable ) + ,.PortBChipEnable ( Wave_PortBChipEnable ) + ,.PortBByteWriteEnable ( Wave_PortBByteWriteEnable ) + ,.PortBDataOut ( Wave_PortBDataOut ) +); +endmodule + diff --git a/DA4008_V1.2/rtl/clk/clk_regfile.v b/DA4008_V1.2/rtl/clk/clk_regfile.v new file mode 100644 index 0000000..6d7be51 --- /dev/null +++ b/DA4008_V1.2/rtl/clk/clk_regfile.v @@ -0,0 +1,599 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 2026/02/28 19:57:30 +// Design Name: +// Module Name: dac_regfile +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// Revision Date: 2026/02/28 19:57:30 +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +// ----------------------------------------------------------- +// -- Register address offset macros +// ----------------------------------------------------------- +//Prbs_en Ctrl Register + +`define CCALRSTNR 8'h00 +`define CCLKDCCENR 8'h04 +`define CASCLKCTR 8'h08 +`define CCALDCCQECPIR 8'h0C +`define CCALQECCTR1 8'h10 +`define CCALDCCCTR1 8'h14 +`define CCALPICTR 8'h18 +`define CCALCROSSCTR 8'h1C +`define CCALRSVR0 8'h20 +`define CCALRSVR1 8'h24 +`define SELCK10GDR 8'h28 +`define SELCK2P5GDR 8'h2C +`define SELCK625MDR 8'h30 +`define P2SDATAENR 8'h34 +`define ENALLPR 8'h38 +`define ENPIPR 8'h3C +`define CLKDIVRSTNR 8'h40 +`define P2SRSVR0 8'h44 +`define P2SRSVR1 8'h48 +`define CKRXSWR 8'h4C +`define RSTCKR 8'h50 +`define CTRLZINR 8'h54 + + +module clk_regfile ( + //system port + input clk // System Main Clock + ,input rstn // Spi Reset active low + //rw op port + ,input [31 :0] wrdata // write data + ,input wren // write enable + ,input [7 :0] rwaddr // read & write address + ,input rden // read enable + ,output [31 :0] rddata // read data + ,output [0 :0] CcalRstn + ,output [3 :0] EnAllP + ,output [0 :0] DccEn + ,output [0 :0] CasGateCkCtrl + ,output [0 :0] SpiEnPi + ,output [0 :0] SpiEnQec + ,output [0 :0] SpiEnDcc + ,output [4 :0] SpiQecCtrlIp + ,output [4 :0] SpiQecCtrlIn + ,output [4 :0] SpiQecCtrlQp + ,output [4 :0] SpiQecCtrlQn + ,output [5 :0] SpiDccCtrlIup + ,output [5 :0] SpiDccCtrlIdn + ,output [5 :0] SpiDccCtrlQup + ,output [5 :0] SpiDccCtrlQdn + ,output [7 :0] SpiSiqNOut + ,output [7 :0] SpiSiqPOut + ,output [3 :0] SpiSiPOut + ,output [3 :0] SpiSqPOut + ,output [2 :0] CrtlCrossOverN + ,output [2 :0] CrtlCrossOverP + ,output [31 :0] CcalRsv0 + ,output [31 :0] CcalRsv1 + ,output [3 :0] SelCk10GDig + ,output [3 :0] SelCk2p5GDig + ,output [8 :0] SelCk625MDig + ,output [15 :0] P2sDataEn + ,output [15 :0] P2sEnAllP + ,output [15 :0] EnPiP + ,output [15 :0] CkDivRstn + ,output [31 :0] p2srsv0 + ,output [31 :0] p2srsv1 + ,output [15 :0] CkRxSw + ,output [15 :0] RstnCk + ,output [15 :0] CtrlZin +); + +localparam L = 1'b0, + H = 1'b1; + +// ------------------------------------------------------ +// -- Register Default Vaule +// ------------------------------------------------------ +wire [0 :0] ccalrstnrdft = 1'b0 ; // CCALRSTNR 16'h0000 +wire [4 :0] cclkdccenrdft = 5'b0 ; // CCLKDCCENR 16'h0004 +wire [0 :0] casclkctrdft = 1'b1 ; // CASCLKCTR 16'h0008 +wire [2 :0] ccaldccqecpirdft = 3'b0 ; // CCALDCCQECPIR 16'h000C +wire [19:0] ccalqecctr1dft = {5'b10001,5'b10001,5'b10000,5'b10000} ; // CCALQECCTR1 16'h0010 +wire [23:0] ccaldccctr1dft = {6'b111111,6'b000000,6'b111111,6'b000000} ; // CCALDCCCTR1 16'h0014 +wire [23:0] ccalpictrdft = {8'b11111111,8'b00000000,4'b0011,4'b0000} ; // CCALPICTR 16'h0018 +wire [5 :0] ccalcrossctrdft = {3'b100,3'b110} ; // CCALCROSSCTR 16'h001C +wire [31:0] ccalrsvr0dft = 32'h0 ; // CCALRSVR0 16'h0020 +wire [31:0] ccalrsvr1dft = 32'h0 ; // CCALRSVR1 16'h0024 +wire [3 :0] selck10gdrdft = 4'b0001 ; // SELCK10GDR 16'h0028 +wire [3 :0] selck2p5gdrdft = 4'b0010 ; // SELCK2P5GDR 16'h002C +wire [8 :0] selck625mdrdft = 9'b100001010 ; // SELCK625MDR 16'h0030 +wire [15:0] p2sdataenrdft = 16'h1 ; // P2SDATAENR 16'h0034 +wire [15:0] enallprdft = 16'h1 ; // ENALLPR 16'h0038 +wire [15:0] enpiprdft = 16'h1 ; // ENPIPR 16'h003C +wire [15:0] clkdivrstnrdft = 16'h1 ; // CLKDIVRSTNR 16'h0040 +wire [31:0] p2srsvr0dft = 32'h0 ; // P2SRSVR0 16'h0044 +wire [31:0] p2srsvr1dft = 32'h0 ; // P2SRSVR1 16'h0048 +wire [15:0] ckrxswrdft = 16'h1 ; // CKRXSWR 16'h004C +wire [15:0] rstckrdft = 16'h1 ; // RSTCKR 16'h0050 +wire [15:0] ctrzinrdft = 16'h1 ; // CTRLZINR 16'h0054 + +// ------------------------------------------------------ +// -- Register enable (select) wires +// ------------------------------------------------------ +wire ccalrstnren ; // CCALRSTNR Enable +wire cclkdccenren ; // CCLKDCCEN Enable +wire casclkctren ; // CASCLKCTR Enable +wire ccaldccqecpiren ; // CCALDCCQECPIR Enable +wire ccalqecctr1en ; // CCALQECCTR1 Enable +wire ccaldccctr1en ; // CCALDCCCTR1 Enable +wire ccalpictren ; // CCALPICTR Enable +wire ccalcrossctren ; // CCALCROSSCTR Enable +wire ccalrsvr0en ; // CCALRSVR0 Enable +wire ccalrsvr1en ; // CCALRSVR1 Enable +wire selck10gdren ; // SELCK10GDR Enable +wire selck2p5gdren ; // SELCK2P5GDR Enable +wire selck625mdren ; // SELCK625MDR Enable +wire p2sdataenren ; // P2SDATAENR Enable +wire enallpren ; // ENALLPR Enable +wire enpipren ; // ENPIPR Enable +wire clkdivrstnren ; // CLKDIVRSTNR Enable +wire p2srsvr0en ; // P2SRSVR0 Enable +wire p2srsvr1en ; // P2SRSVR1 Enable +wire ckrxswren ; // CKRXSWR Enable +wire rstckren ; // RSTCKR Enable +wire ctrzinren ; // CTRLZINR Enable + +// ------------------------------------------------------ +// -- Register write enable wires +// ------------------------------------------------------ +wire ccalrstnrwe ; // CCALRSTNR Write Enable +wire cclkdccenrwe ; // CCLKDCCEN Write Enable +wire casclkctrwe ; // CASCLKCTR Write Enable +wire ccaldccqecpirwe ; // CCALDCCQECPIR Write Enable +wire ccalqecctr1we ; // CCALQECCTR1 Write Enable +wire ccaldccctr1we ; // CCALDCCCTR1 Write Enable +wire ccalpictrwe ; // CCALPICTR Write Enable +wire ccalcrossctrwe ; // CCALCROSSCTR Write Enable +wire ccalrsvr0we ; // CCALRSVR0 Write Enable +wire ccalrsvr1we ; // CCALRSVR1 Write Enable +wire selck10gdrwe ; // SELCK10GDR Write Enable +wire selck2p5gdrwe ; // SELCK2P5GDR Write Enable +wire selck625mdrwe ; // SELCK625MDR Write Enable +wire p2sdataenrwe ; // P2SDATAENR Write Enable +wire enallprwe ; // ENALLPR Write Enable +wire enpiprwe ; // ENPIPR Write Enable +wire clkdivrstnrwe ; // CLKDIVRSTNR Write Enable +wire p2srsvr0we ; // P2SRSVR0 Write Enable +wire p2srsvr1we ; // P2SRSVR1 Write Enable +wire ckrxswrwe ; // CKRXSWR Write Enable +wire rstckrwe ; // RSTCKR Write Enable +wire ctrzinrwe ; // CTRLZINR Write Enable + + +// ------------------------------------------------------ +// -- Misc Registers +// ------------------------------------------------------ +wire [0 :0] ccalrstnr ; // CCALRSTNR Register, Default vaule is 1'b0 +wire [4 :0] cclkdccenr ; // CCLKDCCEN Register, Default vaule is 5'b0 +wire [0 :0] casclkctr ; // CASCLKCTR Register, Default vaule is 1'b1 +wire [2 :0] ccaldccqecpir ; // CCALDCCQECPIR Register, Default vaule is 3'b0 +wire [19:0] ccalqecctr1 ; // CCALQECCTR1 Register, Default vaule is {5'b10001,5'b10001,5'b10000,5'b10000} +wire [23:0] ccaldccctr1 ; // CCALDCCCTR1 Register, Default vaule is {6'b111111,6'b000000,6'b111111,6'b000000} +wire [23:0] ccalpictr ; // CCALPICTR Register, Default vaule is {8'b11111111,8'b00000000,4'b0011,4'b0011} +wire [5 :0] ccalcrossctr ; // CCALCROSSCTR Register, Default vaule is {3'b100,3'b110} +wire [31:0] ccalrsvr0 ; // CCALRSVR0 Register, Default vaule is 32'h0 +wire [31:0] ccalrsvr1 ; // CCALRSVR1 Register, Default vaule is 32'h0 +wire [3 :0] selck10gdr ; // SELCK10GDR Register, Default vaule is 4'b0001 +wire [3 :0] selck2p5gdr ; // SELCK2P5GDR Register, Default vaule is 4'b0010 +wire [8 :0] selck625mdr ; // SELCK625MDR Register, Default vaule is 9'b100001010 +wire [15:0] p2sdataenr ; // P2SDATAENR Register, Default vaule is 16'h1 +wire [15:0] enallpr ; // ENALLPR Register, Default vaule is 16'h1 +wire [15:0] enpipr ; // ENPIPR Register, Default vaule is 16'h1 +wire [15:0] clkdivrstnr ; // CLKDIVRSTNR Register, Default vaule is 16'h1 +wire [31:0] p2srsvr0 ; // P2SRSVR0 Register, Default vaule is 32'h0 +wire [31:0] p2srsvr1 ; // P2SRSVR1 Register, Default vaule is 32'h0 +wire [15:0] ckrxswr ; // CKRXSWR Register, Default vaule is 16'h1 +wire [15:0] rstckr ; // RSTCKR Register, Default vaule is 16'h1 +wire [15:0] ctrzinr ; // CTRLZINR Register, Default vaule is 16'h1 + +reg [31 :0] rddata_reg ; + +// ------------------------------------------------------ +// -- Address decoder +// +// Decodes the register address offset input(reg_addr) +// to produce enable (select) signals for each of the +// SW-registers in the macrocell. The reg_addr input +// is bits [15:0] of the paddr bus. +// ------------------------------------------------------ +assign ccalrstnren = (rwaddr[7:2] == `CCALRSTNR >>2) ? 1'b1 : 1'b0; // CCALRSTNR Enable +assign cclkdccenren = (rwaddr[7:2] == `CCLKDCCENR >>2) ? 1'b1 : 1'b0; // CCLKDCCEN Enable +assign casclkctren = (rwaddr[7:2] == `CASCLKCTR >>2) ? 1'b1 : 1'b0; // CASCLKCTR Enable +assign ccaldccqecpiren = (rwaddr[7:2] == `CCALDCCQECPIR >>2) ? 1'b1 : 1'b0; // CCALDCCQECPIR Enable +assign ccalqecctr1en = (rwaddr[7:2] == `CCALQECCTR1 >>2) ? 1'b1 : 1'b0; // CCALQECCTR1 Enable +assign ccaldccctr1en = (rwaddr[7:2] == `CCALDCCCTR1 >>2) ? 1'b1 : 1'b0; // CCALDCCCTR1 Enable +assign ccalpictren = (rwaddr[7:2] == `CCALPICTR >>2) ? 1'b1 : 1'b0; // CCALPICTR Enable +assign ccalcrossctren = (rwaddr[7:2] == `CCALCROSSCTR >>2) ? 1'b1 : 1'b0; // CCALCROSSCTR Enable +assign ccalrsvr0en = (rwaddr[7:2] == `CCALRSVR0 >>2) ? 1'b1 : 1'b0; // CCALRSVR0 Enable +assign ccalrsvr1en = (rwaddr[7:2] == `CCALRSVR1 >>2) ? 1'b1 : 1'b0; // CCALRSVR1 Enable +assign selck10gdren = (rwaddr[7:2] == `SELCK10GDR >>2) ? 1'b1 : 1'b0; // SELCK10GDR Enable +assign selck2p5gdren = (rwaddr[7:2] == `SELCK2P5GDR >>2) ? 1'b1 : 1'b0; // SELCK2P5GDR Enable +assign selck625mdren = (rwaddr[7:2] == `SELCK625MDR >>2) ? 1'b1 : 1'b0; // SELCK625MDR Enable +assign p2sdataenren = (rwaddr[7:2] == `P2SDATAENR >>2) ? 1'b1 : 1'b0; // P2SDATAENR Enable +assign enallpren = (rwaddr[7:2] == `ENALLPR >>2) ? 1'b1 : 1'b0; // ENALLPR Enable +assign enpipren = (rwaddr[7:2] == `ENPIPR >>2) ? 1'b1 : 1'b0; // ENPIPR Enable +assign clkdivrstnren = (rwaddr[7:2] == `CLKDIVRSTNR >>2) ? 1'b1 : 1'b0; // CLKDIVRSTNR Enable +assign p2srsvr0en = (rwaddr[7:2] == `P2SRSVR0 >>2) ? 1'b1 : 1'b0; // P2SRSVR0 Enable +assign p2srsvr1en = (rwaddr[7:2] == `P2SRSVR1 >>2) ? 1'b1 : 1'b0; // P2SRSVR1 Enable +assign ckrxswren = (rwaddr[7:2] == `CKRXSWR >>2) ? 1'b1 : 1'b0; // CKRXSWR Enable +assign rstckren = (rwaddr[7:2] == `RSTCKR >>2) ? 1'b1 : 1'b0; // RSTCKR Enable +assign ctrzinren = (rwaddr[7:2] == `CTRLZINR >>2) ? 1'b1 : 1'b0; // CTRLZINR Enable + +// ------------------------------------------------------ +// -- Write enable signals +// +// Write enable signals for writable SW-registers. +// The write enable for each register is the ANDed +// result of the register enable and the input reg_wren +// ------------------------------------------------------ +assign ccalrstnrwe = ccalrstnren & wren; // CCALRSTNR Write Enable +assign cclkdccenrwe = cclkdccenren & wren; // CCLKDCCEN Write Enable +assign casclkctrwe = casclkctren & wren; // CASCLKCTR Write Enable +assign ccaldccqecpirwe = ccaldccqecpiren & wren; // CCALDCCQECPIR Write Enable +assign ccalqecctr1we = ccalqecctr1en & wren; // CCALQECCTR1 Write Enable +assign ccaldccctr1we = ccaldccctr1en & wren; // CCALDCCCTR1 Write Enable +assign ccalpictrwe = ccalpictren & wren; // CCALPICTR Write Enable +assign ccalcrossctrwe = ccalcrossctren & wren; // CCALCROSSCTR Write Enable +assign ccalrsvr0we = ccalrsvr0en & wren; // CCALRSVR0 Write Enable +assign ccalrsvr1we = ccalrsvr1en & wren; // CCALRSVR1 Write Enable +assign selck10gdrwe = selck10gdren & wren; // SELCK10GDR Write Enable +assign selck2p5gdrwe = selck2p5gdren & wren; // SELCK2P5GDR Write Enable +assign selck625mdrwe = selck625mdren & wren; // SELCK625MDR Write Enable +assign p2sdataenrwe = p2sdataenren & wren; // P2SDATAENR Write Enable +assign enallprwe = enallpren & wren; // ENALLPR Write Enable +assign enpiprwe = enpipren & wren; // ENPIPR Write Enable +assign clkdivrstnrwe = clkdivrstnren & wren; // CLKDIVRSTNR Write Enable +assign p2srsvr0we = p2srsvr0en & wren; // P2SRSVR0 Write Enable +assign p2srsvr1we = p2srsvr1en & wren; // P2SRSVR1 Write Enable +assign ckrxswrwe = ckrxswren & wren; // CKRXSWR Write Enable +assign rstckrwe = rstckren & wren; // RSTCKR Write Enable +assign ctrzinrwe = ctrzinren & wren; // CTRLZINR Write Enable + + +// ------------------------------------------------------ +// -- ccalrstnr Register +// +// Write ccalrstnr for 'CCALRSTNR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> ccalrstnr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(1) ccalrstnr_dfflrd (ccalrstnrdft, ccalrstnrwe, wrdata[0], ccalrstnr, clk, rstn); + +// ------------------------------------------------------ +// -- cclkdccenr Register +// +// Write cclkdccenr for 'CCLKDCCEN' : 5-bit register +// Register is split into the following bit fields +// +// [4:0] --> cclkdccenr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(5) cclkdccenr_dfflrd (cclkdccenrdft, cclkdccenrwe, wrdata[4:0], cclkdccenr, clk, rstn); + +// ------------------------------------------------------ +// -- casclkctr Register +// +// Write casclkctr for 'CASCLKCTR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> casclkctr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(1) casclkctr_dfflrd (casclkctrdft, casclkctrwe, wrdata[0], casclkctr, clk, rstn); + +// ------------------------------------------------------ +// -- ccaldccqecpir Register +// +// Write ccaldccqecpir for 'CCALDCCQECPIR' : 3-bit register +// Register is split into the following bit fields +// +// [2:0] --> ccaldccqecpir +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(3) ccaldccqecpir_dfflrd (ccaldccqecpirdft, ccaldccqecpirwe, wrdata[2:0], ccaldccqecpir, clk, rstn); + +// ------------------------------------------------------ +// -- ccalqecctr1 Register +// +// Write ccalqecctr1 for 'CCALQECCTR1' : 20-bit register +// Register is split into the following bit fields +// +// [19:0] --> ccalqecctr1 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(20) ccalqecctr1_dfflrd (ccalqecctr1dft, ccalqecctr1we, wrdata[19:0], ccalqecctr1, clk, rstn); + +// ------------------------------------------------------ +// -- ccaldccctr1 Register +// +// Write ccaldccctr1 for 'CCALDCCCTR1' : 24-bit register +// Register is split into the following bit fields +// +// [23:0] --> ccaldccctr1 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(24) biasct3r_dfflrd (ccaldccctr1dft, ccaldccctr1we, wrdata[23:0], ccaldccctr1, clk, rstn); + +// ------------------------------------------------------ +// -- ccalpictr Register +// +// Write ccalpictr for 'CCALPICTR' : 24-bit register +// Register is split into the following bit fields +// +// [23:0] --> ccalpictr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(24) ccalpictr_dfflrd (ccalpictrdft, ccalpictrwe, wrdata[23:0], ccalpictr, clk, rstn); + +// ------------------------------------------------------ +// -- ccalcrossctr Register +// +// Write ccalcrossctr for 'CCALCROSSCTR' : 6-bit register +// Register is split into the following bit fields +// +// [5:0] --> ccalcrossctr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(6) ccalcrossctr_dfflrd (ccalcrossctrdft, ccalcrossctrwe, wrdata[5:0], ccalcrossctr, clk, rstn); + +// ------------------------------------------------------ +// -- ccalrsvr0 Register +// +// Write ccalrsvr0 for 'CCALRSVR0' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> ccalrsvr0 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) ccalrsvr0_dfflrd (ccalrsvr0dft, ccalrsvr0we, wrdata[31:0], ccalrsvr0, clk, rstn); + +// ------------------------------------------------------ +// -- ccalrsvr1 Register +// +// Write ccalrsvr1 for 'CCALRSVR1' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> ccalrsvr1 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) ccalrsvr1_dfflrd (ccalrsvr1dft, ccalrsvr1we, wrdata[31:0], ccalrsvr1, clk, rstn); + + +// ------------------------------------------------------ +// -- selck10gdr Register +// +// Write selck10gdr for 'SELCK10GDR' : 4-bit register +// Register is split into the following bit fields +// +// [3:0] --> selck10gdr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(4) selck10gdr_dfflrd (selck10gdrdft, selck10gdrwe, wrdata[3:0], selck10gdr, clk, rstn); + +// ------------------------------------------------------ +// -- selck2p5gdr Register +// +// Write selck2p5gdr for 'SELCK2P5GDR' : 4-bit register +// Register is split into the following bit fields +// +// [3:0] --> selck2p5gdr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(4) selck2p5gdr_dfflrd (selck2p5gdrdft, selck2p5gdrwe, wrdata[3:0], selck2p5gdr, clk, rstn); + + +// ------------------------------------------------------ +// -- selck625mdr Register +// +// Write selck625mdr for 'SELCK625MDR' : 9-bit register +// Register is split into the following bit fields +// +// [8:0] --> selck625mdr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(9) selck625mdr_dfflrd (selck625mdrdft, selck625mdrwe, wrdata[8:0], selck625mdr, clk, rstn); + + +// ------------------------------------------------------ +// -- p2sdataenr Register +// +// Write p2sdataenr for 'P2SDATAENR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> p2sdataenr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) p2sdataenr_dfflrd (p2sdataenrdft, p2sdataenrwe, wrdata[15:0], p2sdataenr, clk, rstn); + + +// ------------------------------------------------------ +// -- enallpr Register +// +// Write enallpr for 'ENALLPR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> enallpr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) enallpr_dfflrd (enallprdft, enallprwe, wrdata[15:0], enallpr, clk, rstn); + +// ------------------------------------------------------ +// -- enpipr Register +// +// Write enpipr for 'ENPIPR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> enpipr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) enpipr_dfflrd (enpiprdft, enpiprwe, wrdata[15:0], enpipr, clk, rstn); + +// ------------------------------------------------------ +// -- clkdivrstnr Register +// +// Write clkdivrstnr for 'CLKDIVRSTNR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> clkdivrstnr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) clkdivrstnr_dfflrd (clkdivrstnrdft, clkdivrstnrwe, wrdata[15:0], clkdivrstnr, clk, rstn); + +// ------------------------------------------------------ +// -- p2srsvr0 Register +// +// Write p2srsvr0 for 'P2SRSVR0' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> p2srsvr0 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) p2srsvr0_dfflrd (p2srsvr0dft, p2srsvr0we, wrdata[31:0], p2srsvr0, clk, rstn); + +// ------------------------------------------------------ +// -- p2srsvr1 Register +// +// Write p2srsvr1 for 'P2SRSVR1' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> p2srsvr1 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) p2srsvr1_dfflrd (p2srsvr1dft, p2srsvr1we, wrdata[31:0], p2srsvr1, clk, rstn); + + +// ------------------------------------------------------ +// -- ckrxswr Register +// +// Write ckrxswr for 'CKRXSWR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> ckrxswr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) ckrxswr_dfflrd (ckrxswrdft, ckrxswrwe, wrdata[15:0], ckrxswr, clk, rstn); + + +// ------------------------------------------------------ +// -- rstckr Register +// +// Write rstckr for 'RSTCKR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> rstckr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) rstckr_dfflrd (rstckrdft, rstckrwe, wrdata[15:0], rstckr, clk, rstn); + +// ------------------------------------------------------ +// -- ctrzinr Register +// +// Write ctrzinr for 'CTRLZINR' : 16-bit register +// Register is split into the following bit fields +// +// [15:0] --> ctrzinr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(16) ctrzinr_dfflrd (ctrzinrdft, ctrzinrwe, wrdata[15:0], ctrzinr, clk, rstn); + +// ------------------------------------------------------ +// -- Read data mux +// +// -- The data from the selected register is +// -- placed on a zero-padded 32-bit read data bus. +// ------------------------------------------------------ +always @(*) begin : RDDATA_PROC + rddata_reg = {32{1'b0}}; + if(ccalrstnren == H ) rddata_reg[0 :0] = ccalrstnr[0 :0] ; + if(cclkdccenren == H ) rddata_reg[4 :0] = cclkdccenr[4 :0] ; + if(casclkctren == H ) rddata_reg[0 :0] = casclkctr[0 :0] ; + if(ccaldccqecpiren == H ) rddata_reg[2 :0] = ccaldccqecpir[2 :0] ; + if(ccalqecctr1en == H ) rddata_reg[19:0] = ccalqecctr1[19:0] ; + if(ccaldccctr1en == H ) rddata_reg[23:0] = ccaldccctr1[23:0] ; + if(ccalpictren == H ) rddata_reg[23:0] = ccalpictr[23:0] ; + if(ccalcrossctren == H ) rddata_reg[5 :0] = ccalcrossctr[5 :0] ; + if(ccalrsvr0en == H ) rddata_reg[31:0] = ccalrsvr0[31:0] ; + if(ccalrsvr1en == H ) rddata_reg[31:0] = ccalrsvr1[31:0] ; + if(selck10gdren == H ) rddata_reg[3 :0] = selck10gdr[3 :0] ; + if(selck2p5gdren == H ) rddata_reg[3 :0] = selck2p5gdr[3 :0] ; + if(selck625mdren == H ) rddata_reg[8 :0] = selck625mdr[8 :0] ; + if(p2sdataenren == H ) rddata_reg[15:0] = p2sdataenr[15:0] ; + if(enallpren == H ) rddata_reg[15:0] = enallpr[15:0] ; + if(enpipren == H ) rddata_reg[15:0] = enpipr[15:0] ; + if(clkdivrstnren == H ) rddata_reg[15:0] = clkdivrstnr[15:0] ; + if(p2srsvr0en == H ) rddata_reg[31:0] = p2srsvr0[31:0] ; + if(p2srsvr1en == H ) rddata_reg[31:0] = p2srsvr1[31:0] ; + if(ckrxswren == H ) rddata_reg[15:0] = ckrxswr[15:0] ; + if(rstckren == H ) rddata_reg[15:0] = rstckr[15:0] ; + if(ctrzinren == H ) rddata_reg[15:0] = ctrzinr[15:0] ; +end + +//rddata +sirv_gnrl_dffr #(32) rddata_dffr (rddata_reg, rddata, clk, rstn); + +// ------------------------------------------------------ +// -- Output signals assignment +// ------------------------------------------------------ +assign CcalRstn = ccalrstnr ; +assign EnAllP = cclkdccenr ; +assign DccEn = casclkctr ; +assign CasGateCkCtrl = casclkctr ; +assign SpiEnPi = ccaldccqecpir[2] ; +assign SpiEnQec = ccaldccqecpir[1] ; +assign SpiEnDcc = ccaldccqecpir[0] ; +assign SpiQecCtrlIp = ccalqecctr1[19:15] ; +assign SpiQecCtrlIn = ccalqecctr1[14:10] ; +assign SpiQecCtrlQp = ccalqecctr1[9 : 5] ; +assign SpiQecCtrlQn = ccalqecctr1[4 : 0] ; + +assign SpiDccCtrlIup = ccaldccctr1[23:18] ; +assign SpiDccCtrlIdn = ccaldccctr1[17:12] ; +assign SpiDccCtrlQup = ccaldccctr1[11: 6] ; +assign SpiDccCtrlQdn = ccaldccctr1[5 : 0] ; + +assign SpiSiqNOut = ccalpictr[23:16] ; +assign SpiSiqPOut = ccalpictr[15: 8] ; +assign SpiSiPOut = ccalpictr[7 : 4] ; +assign SpiSqPOut = ccalpictr[3 : 0] ; + +assign CrtlCrossOverN = ccalcrossctr[5:3] ; +assign CrtlCrossOverP = ccalcrossctr[2:0] ; +assign CcalRsv0 = ccalrsvr0 ; +assign CcalRsv1 = ccalrsvr0 ; + +assign SelCk10GDig = selck10gdr ; +assign SelCk2p5GDig = selck2p5gdr ; +assign SelCk625MDig = selck625mdr ; +assign P2sDataEn = p2sdataenr ; +assign P2sEnAllP = enallpr ; +assign EnPiP = enpipr ; +assign CkDivRstn = clkdivrstnr ; +assign p2srsv0 = p2srsvr0 ; +assign p2srsv1 = p2srsvr1 ; +assign CkRxSw = ckrxswr ; +assign RstnCk = rstckr ; +assign CtrlZin = ctrzinr ; + +endmodule + +`undef CCALRSTNR +`undef CCLKDCCENR +`undef CASCLKCTR +`undef CCALDCCQECPIR +`undef CCALQECCTR1 +`undef CCALDCCCTR1 +`undef CCALPICTR +`undef CCALCROSSCTR +`undef CCALRSVR0 +`undef CCALRSVR1 +`undef SELCK10GDR +`undef SELCK2P5GDR +`undef SELCK625MDR +`undef P2SDATAENR +`undef ENALLPR +`undef ENPIPR +`undef CLKDIVRSTNR +`undef P2SRSVR0 +`undef P2SRSVR1 +`undef CKRXSWR +`undef RSTCKR +`undef CTRLZINR +`undef VERSIONR + diff --git a/DA4008_V1.2/rtl/comm/pulse_generator.sv b/DA4008_V1.2/rtl/comm/pulse_generator.sv new file mode 100644 index 0000000..e6deae7 --- /dev/null +++ b/DA4008_V1.2/rtl/comm/pulse_generator.sv @@ -0,0 +1,54 @@ + +module pulse_generator #( + parameter DATA_WIDTH = 16 + )( + input logic clk, + input logic rst_n, + input logic pulse_en, + input logic [DATA_WIDTH-1:0] delay, + input logic [DATA_WIDTH-1:0] width, + input logic inv_en, + output logic pulse + ); + + logic [DATA_WIDTH-1:0] counter; // 用于延迟和宽度计数 + + logic pulse_delay_done; + logic pulse_width_done; + assign pulse_delay_done = (counter == delay); + assign pulse_width_done = (counter == width); + + localparam SM_IDLE = 0; + localparam SM_WAIT = 1; + localparam SM_WORK = 2; + logic [1:0] current_state; + always @(posedge clk or negedge rst_n) begin + if(!rst_n) begin + current_state <= SM_IDLE; + end else begin + case(current_state) + SM_IDLE: current_state <= pulse_en ? SM_WAIT : SM_IDLE; + SM_WAIT: current_state <= pulse_delay_done ? SM_WORK : SM_WAIT; + SM_WORK: current_state <= pulse_width_done ? SM_IDLE : SM_WORK; + endcase + end + end + + always @(posedge clk) begin + case(current_state) + SM_IDLE: counter <= 1; + SM_WAIT: counter <= pulse_delay_done ? 1 : (counter + 1); + SM_WORK: counter <= pulse_width_done ? 1 : (counter + 1); + endcase + end + + + always @(posedge clk) begin + case(current_state) + SM_IDLE: pulse <= inv_en; + SM_WAIT: pulse <= pulse_delay_done ? ~inv_en : inv_en; + SM_WORK: pulse <= pulse_width_done ? inv_en : ~inv_en; + endcase + end + +endmodule \ No newline at end of file diff --git a/DA4008_V1.2/rtl/comm/ramp_gen.v b/DA4008_V1.2/rtl/comm/ramp_gen.v new file mode 100644 index 0000000..c3846fc --- /dev/null +++ b/DA4008_V1.2/rtl/comm/ramp_gen.v @@ -0,0 +1,104 @@ +module ramp_gen ( + // system ports + input clk, + input rst_n, + input [1:0] dac_mode_sel, + input cen, + input [7:0] step, // 8-bit step value + input fixed, + input [7:0] fixed_value, // 8-bit fixed value + input [31:0] ifs, + output [7:0] ramp [63:0], // 64 channels of 8-bit output + output ramp_vld +); + +////////////////////////////////////////////////////////////// +// Counter to generate ramp_add_en enable signal +////////////////////////////////////////////////////////////// +reg [31:0] cnt_c; +wire add_cnt = cen & ~fixed; +wire end_cnt = add_cnt && (cnt_c == ifs - 1); + +wire [31:0] cnt_n = end_cnt ? 32'h0 : + add_cnt ? cnt_c + 1'b1 : + cnt_c; + +always @(posedge clk or negedge rst_n) begin + if (!rst_n) cnt_c <= 32'h0; + else cnt_c <= cnt_n; +end + +reg ramp_add_en; +always @(posedge clk or negedge rst_n) begin + if (!rst_n) ramp_add_en <= 1'b0; + else ramp_add_en <= end_cnt | ((ifs == 32'b0) & cen) | fixed; +end + +////////////////////////////////////////////////////////////// +// Pre-calculated step multiples (for special mode) +////////////////////////////////////////////////////////////// +wire [7:0] step2_w = step << 1; +wire [7:0] step4_w = step << 2; +wire [7:0] step8_w = step << 3; +wire [7:0] step16_w = step << 4; +wire [7:0] step32_w = step << 5; +wire [7:0] step64_w = step << 6; + +////////////////////////////////////////////////////////////// +// Generate 64 independent always blocks using generate +////////////////////////////////////////////////////////////// +genvar i; +generate + for (i = 0; i < 64; i = i + 1) begin : ramp_chan + reg [7:0] ramp_r; + + always @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + ramp_r <= 8'b0; + end + else if (fixed) begin + ramp_r <= fixed_value; + end + else if (ifs == 32'b0) begin + // Special mode: ifs == 0 + if (cen & ~ramp_add_en) begin + // Initial phase loading: channel i gets (i+1)*step + ramp_r <= (i + 1) * step; + end + else if (ramp_add_en) begin + // Add large step each cycle (select 64¡Ástep or 32¡Ástep according to dac_mode_sel[1]) + ramp_r <= ramp_r + (dac_mode_sel[1] ? step64_w : step32_w); + end + else begin + // Hold current value + ramp_r <= ramp_r; + end + end + else begin + // Normal mode: add step every ifs cycles + if (ramp_add_en) begin + ramp_r <= ramp_r + step; + end + else begin + ramp_r <= ramp_r; + end + end + end + + // Connect internal register to output port + assign ramp[i] = ramp_r; + end +endgenerate + +////////////////////////////////////////////////////////////// +// Output valid signal +////////////////////////////////////////////////////////////// +reg en_dly; +always @(posedge clk or negedge rst_n) begin + if (!rst_n) en_dly <= 1'b0; + else en_dly <= cen | fixed; +end + +assign ramp_vld = en_dly; + +endmodule diff --git a/DA4008_V1.2/rtl/comm/sirv_gnrl_dffs.v b/DA4008_V1.2/rtl/comm/sirv_gnrl_dffs.v new file mode 100644 index 0000000..2528ba0 --- /dev/null +++ b/DA4008_V1.2/rtl/comm/sirv_gnrl_dffs.v @@ -0,0 +1,342 @@ + /* + Copyright 2018-2020 Nuclei System Technology, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + + +//===================================================================== +// +// Designer : Bob Hu +// +// Description: +// All of the general DFF and Latch modules +// +// ==================================================================== + +// + + +// +// =========================================================================== +// +// Description: +// Verilog module sirv_gnrl DFF with Load-enable and Reset +// Default reset value is 1 +// +// =========================================================================== +`define DISABLE_SV_ASSERTION +`define dly #0.2 +module sirv_gnrl_dfflrs # ( + parameter DW = 32 +) ( + + input lden, + input [DW-1:0] dnxt, + output [DW-1:0] qout, + + input clk, + input rst_n +); + +reg [DW-1:0] qout_r; + +always @(posedge clk or negedge rst_n) +begin : DFFLRS_PROC + if (rst_n == 1'b0) + qout_r <= {DW{1'b1}}; + else if (lden == 1'b1) + qout_r <= `dly dnxt; +end + +assign qout = qout_r; + +`ifndef FPGA_SOURCE//{ +`ifndef DISABLE_SV_ASSERTION//{ +//synopsys translate_off +sirv_gnrl_xchecker # ( + .DW(1) +) sirv_gnrl_xchecker( + .i_dat(lden), + .clk (clk) +); +//synopsys translate_on +`endif//} +`endif//} + + +endmodule +// =========================================================================== +// +// Description: +// Verilog module sirv_gnrl DFF with Load-enable and Reset +// Default reset value is 0 +// +// =========================================================================== + +module sirv_gnrl_dfflr # ( + parameter DW = 32 +) ( + + input lden, + input [DW-1:0] dnxt, + output [DW-1:0] qout, + + input clk, + input rst_n +); + +reg [DW-1:0] qout_r; + +always @(posedge clk or negedge rst_n) +begin : DFFLR_PROC + if (rst_n == 1'b0) + qout_r <= {DW{1'b0}}; + else if (lden == 1'b1) + qout_r <= `dly dnxt; +end + +assign qout = qout_r; + +`ifndef FPGA_SOURCE//{ +`ifndef DISABLE_SV_ASSERTION//{ +//synopsys translate_off +sirv_gnrl_xchecker # ( + .DW(1) +) sirv_gnrl_xchecker( + .i_dat(lden), + .clk (clk) +); +//synopsys translate_on +`endif//} +`endif//} + + +endmodule + +// =========================================================================== +// +// Description: +// Verilog module sirv_gnrl DFF with Load-enable and Reset +// Default reset value is input +// +// =========================================================================== + +module sirv_gnrl_dfflrd # ( + parameter DW = 32 +) ( + input [DW-1:0] init, + input lden, + input [DW-1:0] dnxt, + output [DW-1:0] qout, + + input clk, + input rst_n +); + +reg [DW-1:0] qout_r; + +always @(posedge clk or negedge rst_n) +begin : DFFLR_PROC + if (rst_n == 1'b0) + qout_r <= init; + else if (lden == 1'b1) + qout_r <= `dly dnxt; +end + +assign qout = qout_r; + +`ifndef FPGA_SOURCE//{ +`ifndef DISABLE_SV_ASSERTION//{ +//synopsys translate_off +sirv_gnrl_xchecker # ( + .DW(1) +) sirv_gnrl_xchecker( + .i_dat(lden), + .clk (clk) +); +//synopsys translate_on +`endif//} +`endif//} + + +endmodule + +// =========================================================================== +// +// Description: +// Verilog module sirv_gnrl DFF with Load-enable, no reset +// +// =========================================================================== + +module sirv_gnrl_dffl # ( + parameter DW = 32 +) ( + + input lden, + input [DW-1:0] dnxt, + output [DW-1:0] qout, + + input clk +); + +reg [DW-1:0] qout_r; + +always @(posedge clk) +begin : DFFL_PROC + if (lden == 1'b1) + qout_r <= `dly dnxt; +end + +assign qout = qout_r; + +`ifndef FPGA_SOURCE//{ +`ifndef DISABLE_SV_ASSERTION//{ +//synopsys translate_off +sirv_gnrl_xchecker # ( + .DW(1) +) sirv_gnrl_xchecker( + .i_dat(lden), + .clk (clk) +); +//synopsys translate_on +`endif//} +`endif//} + + +endmodule +// =========================================================================== +// +// Description: +// Verilog module sirv_gnrl DFF with Reset, no load-enable +// Default reset value is 1 +// +// =========================================================================== + +module sirv_gnrl_dffrs # ( + parameter DW = 32 +) ( + + input [DW-1:0] dnxt, + output [DW-1:0] qout, + + input clk, + input rst_n +); + +reg [DW-1:0] qout_r; + +always @(posedge clk or negedge rst_n) +begin : DFFRS_PROC + if (rst_n == 1'b0) + qout_r <= {DW{1'b1}}; + else + qout_r <= `dly dnxt; +end + +assign qout = qout_r; + +endmodule +// =========================================================================== +// +// Description: +// Verilog module sirv_gnrl DFF with Reset, no load-enable +// Default reset value is 0 +// +// =========================================================================== + +module sirv_gnrl_dffr # ( + parameter DW = 32 +) ( + + input [DW-1:0] dnxt, + output [DW-1:0] qout, + + input clk, + input rst_n +); + +reg [DW-1:0] qout_r; + +always @(posedge clk or negedge rst_n) +begin : DFFR_PROC + if (rst_n == 1'b0) + qout_r <= {DW{1'b0}}; + else + qout_r <= `dly dnxt; +end + +assign qout = qout_r; + +endmodule +// =========================================================================== +// +// Description: +// Verilog module for general latch +// +// =========================================================================== + +module sirv_gnrl_ltch # ( + parameter DW = 32 +) ( + + //input test_mode, + input lden, + input [DW-1:0] dnxt, + output [DW-1:0] qout +); + +reg [DW-1:0] qout_r; + +always @ * +begin : LTCH_PROC + if (lden == 1'b1) + qout_r <= dnxt; +end + +//assign qout = test_mode ? dnxt : qout_r; +assign qout = qout_r; + +`ifndef FPGA_SOURCE//{ +`ifndef DISABLE_SV_ASSERTION//{ +//synopsys translate_off +always_comb +begin + CHECK_THE_X_VALUE: + assert (lden !== 1'bx) + else $fatal ("\n Error: Oops, detected a X value!!! This should never happen. \n"); +end + +//synopsys translate_on +`endif//} +`endif//} + + +endmodule + +module sirv_gnrl_edffr #(parameter type T = logic) ( + input T dnxt, + output T qout, + input clk, rst_n +); + +T qout_r; + +always_ff @(posedge clk or negedge rst_n) begin + if (!rst_n) qout_r <= T'('0); + else qout_r <= `dly dnxt; +end +assign qout = qout_r; +endmodule + diff --git a/DA4008_V1.2/rtl/comm/sirv_gnrl_xchecker.v b/DA4008_V1.2/rtl/comm/sirv_gnrl_xchecker.v new file mode 100644 index 0000000..6e9df85 --- /dev/null +++ b/DA4008_V1.2/rtl/comm/sirv_gnrl_xchecker.v @@ -0,0 +1,49 @@ + /* + Copyright 2018-2020 Nuclei System Technology, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + + +//===================================================================== +// +// Designer : Bob Hu +// +// Description: +// Verilog module for X checker +// +// ==================================================================== + + +`ifndef FPGA_SOURCE//{ +`ifndef DISABLE_SV_ASSERTION//{ +//synopsys translate_off +module sirv_gnrl_xchecker # ( + parameter DW = 32 +) ( + input [DW-1:0] i_dat, + input clk +); + + +CHECK_THE_X_VALUE: + assert property (@(posedge clk) + ((^(i_dat)) !== 1'bx) + ) + else $fatal ("\n Error: Oops, detected a X value!!! This should never happen. \n"); + +endmodule +//synopsys translate_on +`endif//} +`endif//} diff --git a/DA4008_V1.2/rtl/comm/syncer.v b/DA4008_V1.2/rtl/comm/syncer.v new file mode 100644 index 0000000..6d4e0a2 --- /dev/null +++ b/DA4008_V1.2/rtl/comm/syncer.v @@ -0,0 +1,58 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : syncer.v +// Department : +// Author : PWY +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 0.1 2024-03-13 PWY AWG dedicated register file +// 0.2 2024-05-13 PWY +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + + +module syncer # ( + parameter width = 1 + ,parameter stage = 2 + ) + ( + input clk_d + ,input rstn_d + ,input [width-1:0] data_s + ,output [width-1:0] data_d +); + +generate + genvar i; + wire [width-1:0] data_temp[stage-1:0]; + sirv_gnrl_dffr #(width) data_temp0_dffr (data_s ,data_temp[0], clk_d, rstn_d); + for(i=1;i>2) ? 1'b1 : 1'b0; // RTERMR Enable +assign prbsren = (rwaddr[15:2] == `PRBSENR >>2) ? 1'b1 : 1'b0; // PRBSENR Enable +assign set0ren = (rwaddr[15:2] == `SET0R >>2) ? 1'b1 : 1'b0; // SET0R Enable +assign set1ren = (rwaddr[15:2] == `SET1R >>2) ? 1'b1 : 1'b0; // SET1R Enable +assign set2ren = (rwaddr[15:2] == `SET2R >>2) ? 1'b1 : 1'b0; // SET2R Enable +assign set3ren = (rwaddr[15:2] == `SET3R >>2) ? 1'b1 : 1'b0; // SET3R Enable +assign set4ren = (rwaddr[15:2] == `SET4R >>2) ? 1'b1 : 1'b0; // SET4R Enable +assign set5ren = (rwaddr[15:2] == `SET5R >>2) ? 1'b1 : 1'b0; // SET5R Enable +assign set6ren = (rwaddr[15:2] == `SET6R >>2) ? 1'b1 : 1'b0; // SET6R Enable +assign set7ren = (rwaddr[15:2] == `SET7R >>2) ? 1'b1 : 1'b0; // SET7R Enable +assign set8ren = (rwaddr[15:2] == `SET8R >>2) ? 1'b1 : 1'b0; // SET8R Enable +assign set9ren = (rwaddr[15:2] == `SET9R >>2) ? 1'b1 : 1'b0; // SET9R Enable +assign set10ren = (rwaddr[15:2] == `SET10R >>2) ? 1'b1 : 1'b0; // SET10R Enable +assign set11ren = (rwaddr[15:2] == `SET11R >>2) ? 1'b1 : 1'b0; // SET11R Enable +assign set12ren = (rwaddr[15:2] == `SET12R >>2) ? 1'b1 : 1'b0; // SET12R Enable +assign set13ren = (rwaddr[15:2] == `SET13R >>2) ? 1'b1 : 1'b0; // SET13R Enable +assign set14ren = (rwaddr[15:2] == `SET14R >>2) ? 1'b1 : 1'b0; // SET14R Enable +assign set15ren = (rwaddr[15:2] == `SET15R >>2) ? 1'b1 : 1'b0; // SET15R Enable +assign set16ren = (rwaddr[15:2] == `SET16R >>2) ? 1'b1 : 1'b0; // SET16R Enable +assign set17ren = (rwaddr[15:2] == `SET17R >>2) ? 1'b1 : 1'b0; // SET17R Enable +assign set18ren = (rwaddr[15:2] == `SET18R >>2) ? 1'b1 : 1'b0; // SET18R Enable +assign set19ren = (rwaddr[15:2] == `SET19R >>2) ? 1'b1 : 1'b0; // SET19R Enable +assign set20ren = (rwaddr[15:2] == `SET20R >>2) ? 1'b1 : 1'b0; // SET20R Enable +assign set21ren = (rwaddr[15:2] == `SET21R >>2) ? 1'b1 : 1'b0; // SET21R Enable +assign set22ren = (rwaddr[15:2] == `SET22R >>2) ? 1'b1 : 1'b0; // SET22R Enable +assign set23ren = (rwaddr[15:2] == `SET23R >>2) ? 1'b1 : 1'b0; // SET23R Enable +assign set24ren = (rwaddr[15:2] == `SET24R >>2) ? 1'b1 : 1'b0; // SET24R Enable +assign set25ren = (rwaddr[15:2] == `SET25R >>2) ? 1'b1 : 1'b0; // SET25R Enable +assign set26ren = (rwaddr[15:2] == `SET26R >>2) ? 1'b1 : 1'b0; // SET26R Enable +assign set27ren = (rwaddr[15:2] == `SET27R >>2) ? 1'b1 : 1'b0; // SET27R Enable +assign set28ren = (rwaddr[15:2] == `SET28R >>2) ? 1'b1 : 1'b0; // SET28R Enable +assign set29ren = (rwaddr[15:2] == `SET29R >>2) ? 1'b1 : 1'b0; // SET29R Enable +assign set30ren = (rwaddr[15:2] == `SET30R >>2) ? 1'b1 : 1'b0; // SET30R Enable +assign set31ren = (rwaddr[15:2] == `SET31R >>2) ? 1'b1 : 1'b0; // SET31R Enable +assign casaddrren = (rwaddr[15:2] == `CASADDRR >>2) ? 1'b1 : 1'b0; // CASADDRR Enable +assign casdwren = (rwaddr[15:2] == `CASDWR >>2) ? 1'b1 : 1'b0; // CASDWR Enable +assign imctren = (rwaddr[15:2] == `IMCTR >>2) ? 1'b1 : 1'b0; // IMCTR Enable +assign ibleedctren = (rwaddr[15:2] == `IBLEEDCTR >>2) ? 1'b1 : 1'b0; // IBLEEDCTR Enable +assign iclkcmlren = (rwaddr[15:2] == `ICLKCMLR >>2) ? 1'b1 : 1'b0; // ICLKCMLR Enable +assign currsvr0en = (rwaddr[15:2] == `CURRSVR0 >>2) ? 1'b1 : 1'b0; // CURRSVR0 Enable +assign currsvr1en = (rwaddr[15:2] == `CURRSVR1 >>2) ? 1'b1 : 1'b0; // CURRSVR1 Enable +assign verren = (rwaddr[15:2] == `VERSIONR >>2) ? 1'b1 : 1'b0; // VERSIONR Enable + +// ------------------------------------------------------ +// -- Write enable signals +// +// Write enable signals for writable SW-registers. +// The write enable for each register is the ANDed +// result of the register enable and the input reg_wren +// ------------------------------------------------------ +assign rtermrwe = rtermren & wren; // RTERMR Write Enable +assign prbsrwe = prbsren & wren; // PRBSENR Write Enable +assign set0rwe = set0ren & wren; // SET0R Write Enable +assign set1rwe = set1ren & wren; // SET1R Write Enable +assign set2rwe = set2ren & wren; // SET2R Write Enable +assign set3rwe = set3ren & wren; // SET3R Write Enable +assign set4rwe = set4ren & wren; // SET4R Write Enable +assign set5rwe = set5ren & wren; // SET5R Write Enable +assign set6rwe = set6ren & wren; // SET6R Write Enable +assign set7rwe = set7ren & wren; // SET7R Write Enable +assign set8rwe = set8ren & wren; // SET8R Write Enable +assign set9rwe = set9ren & wren; // SET9R Write Enable +assign set10rwe = set10ren & wren; // SET10R Write Enable +assign set11rwe = set11ren & wren; // SET11R Write Enable +assign set12rwe = set12ren & wren; // SET12R Write Enable +assign set13rwe = set13ren & wren; // SET13R Write Enable +assign set14rwe = set14ren & wren; // SET14R Write Enable +assign set15rwe = set15ren & wren; // SET15R Write Enable +assign set16rwe = set16ren & wren; // SET16R Write Enable +assign set17rwe = set17ren & wren; // SET17R Write Enable +assign set18rwe = set18ren & wren; // SET18R Write Enable +assign set19rwe = set19ren & wren; // SET19R Write Enable +assign set20rwe = set20ren & wren; // SET20R Write Enable +assign set21rwe = set21ren & wren; // SET21R Write Enable +assign set22rwe = set22ren & wren; // SET22R Write Enable +assign set23rwe = set23ren & wren; // SET23R Write Enable +assign set24rwe = set24ren & wren; // SET24R Write Enable +assign set25rwe = set25ren & wren; // SET25R Write Enable +assign set26rwe = set26ren & wren; // SET26R Write Enable +assign set27rwe = set27ren & wren; // SET27R Write Enable +assign set28rwe = set28ren & wren; // SET28R Write Enable +assign set29rwe = set29ren & wren; // SET29R Write Enable +assign set30rwe = set30ren & wren; // SET30R Write Enable +assign set31rwe = set31ren & wren; // SET31R Write Enable +assign casaddrrwe = casaddrren & wren; // CASADDRR Write Enable +assign casdwrwe = casdwren & wren; // CASDWR Write Enable +assign imctrwe = imctren & wren; // IMCTR Write Enable +assign ibleedctrwe = ibleedctren & wren; // IBLEEDCTR Write Enable +assign iclkcmlrwe = iclkcmlren & wren; // ICLKCMLR Write Enable +assign currsvr0we = currsvr0en & wren; // CURRSVR0 Write Enable +assign currsvr1we = currsvr1en & wren; // CURRSVR1 Write Enable + +// ------------------------------------------------------ +// -- rtermr Register +// +// Write prbs_reg for 'RTERMR' : 4-bit register +// Register is split into the following bit fields +// +// [3:0] --> rtermr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(4) rtermr_dfflrd (rtermrdft, rtermrwe, wrdata[3:0], rtermr, clk, rstn); + +// ------------------------------------------------------ +// -- prbsr Register +// +// Write prbs_reg for 'PRBSENR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> prbsr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(1) prbsr_dfflrd (prbsrdft, prbsrwe, wrdata[0], prbsr, clk, rstn); + +// ------------------------------------------------------ +// -- set0r Register +// +// Write set0r for 'SET0R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set0r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set0r_dfflrd (set0rdft, set0rwe, wrdata[31:0], set0r, clk, rstn); + +// ------------------------------------------------------ +// -- set1r Register +// +// Write set1r for 'SET1R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set1r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set1r_dfflrd (set1rdft, set1rwe, wrdata[31:0], set1r, clk, rstn); + +// ------------------------------------------------------ +// -- set2r Register +// +// Write set2r for 'SET2R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set2r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set2r_dfflrd (set2rdft, set2rwe, wrdata[31:0], set2r, clk, rstn); + +// ------------------------------------------------------ +// -- set3r Register +// +// Write set3r for 'SET3R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set3r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set3r_dfflrd (set3rdft, set3rwe, wrdata[31:0], set3r, clk, rstn); + +// ------------------------------------------------------ +// -- set4r Register +// +// Write set4r for 'SET4R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set4r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set4r_dfflrd (set4rdft, set4rwe, wrdata[31:0], set4r, clk, rstn); + +// ------------------------------------------------------ +// -- set5r Register +// +// Write set5r for 'SET5R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set5r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set5r_dfflrd (set5rdft, set5rwe, wrdata[31:0], set5r, clk, rstn); + +// ------------------------------------------------------ +// -- set6r Register +// +// Write set6r for 'SET6R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set6r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set6r_dfflrd (set6rdft, set6rwe, wrdata[31:0], set6r, clk, rstn); + +// ------------------------------------------------------ +// -- set7r Register +// +// Write set7r for 'SET7R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set7r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set7r_dfflrd (set7rdft, set7rwe, wrdata[31:0], set7r, clk, rstn); + +// ------------------------------------------------------ +// -- set8r Register +// +// Write set8r for 'SET8R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set8r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set8r_dfflrd (set8rdft, set8rwe, wrdata[31:0], set8r, clk, rstn); + +// ------------------------------------------------------ +// -- set9r Register +// +// Write set9r for 'SET9R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set9r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set9r_dfflrd (set9rdft, set9rwe, wrdata[31:0], set9r, clk, rstn); + +// ------------------------------------------------------ +// -- set10r Register +// +// Write set10r for 'SET10R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set10r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set10r_dfflrd (set10rdft, set10rwe, wrdata[31:0], set10r, clk, rstn); + +// ------------------------------------------------------ +// -- set11r Register +// +// Write set11r for 'SET11R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set11r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set11r_dfflrd (set11rdft, set11rwe, wrdata[31:0], set11r, clk, rstn); + +// ------------------------------------------------------ +// -- set12r Register +// +// Write set12r for 'SET12R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set12r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set12r_dfflrd (set12rdft, set12rwe, wrdata[31:0], set12r, clk, rstn); + +// ------------------------------------------------------ +// -- set13r Register +// +// Write set13r for 'SET13R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set13r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set13r_dfflrd (set13rdft, set13rwe, wrdata[31:0], set13r, clk, rstn); + +// ------------------------------------------------------ +// -- set14r Register +// +// Write set14r for 'SET14R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set14r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set14r_dfflrd (set14rdft, set14rwe, wrdata[31:0], set14r, clk, rstn); + +// ------------------------------------------------------ +// -- set15r Register +// +// Write set15r for 'SET15R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set15r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set15r_dfflrd (set15rdft, set15rwe, wrdata[31:0], set15r, clk, rstn); + +// ------------------------------------------------------ +// -- set16r Register +// +// Write set16r for 'SET16R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set16r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set16r_dfflrd (set16rdft, set16rwe, wrdata[31:0], set16r, clk, rstn); + +// ------------------------------------------------------ +// -- set17r Register +// +// Write set17r for 'SET17R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set17r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set17r_dfflrd (set17rdft, set17rwe, wrdata[31:0], set17r, clk, rstn); + +// ------------------------------------------------------ +// -- set18r Register +// +// Write set18r for 'SET18R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set18r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set18r_dfflrd (set18rdft, set18rwe, wrdata[31:0], set18r, clk, rstn); + +// ------------------------------------------------------ +// -- set19r Register +// +// Write set19r for 'SET19R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set19r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set19r_dfflrd (set19rdft, set19rwe, wrdata[31:0], set19r, clk, rstn); + +// ------------------------------------------------------ +// -- set20r Register +// +// Write set20r for 'SET20R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set20r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set20r_dfflrd (set20rdft, set20rwe, wrdata[31:0], set20r, clk, rstn); + +// ------------------------------------------------------ +// -- set21r Register +// +// Write set21r for 'SET21R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set21r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set21r_dfflrd (set21rdft, set21rwe, wrdata[31:0], set21r, clk, rstn); + +// ------------------------------------------------------ +// -- set22r Register +// +// Write set22r for 'SET22R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set22r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set22r_dfflrd (set22rdft, set22rwe, wrdata[31:0], set22r, clk, rstn); + +// ------------------------------------------------------ +// -- set23r Register +// +// Write set23r for 'SET23R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set23r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set23r_dfflrd (set23rdft, set23rwe, wrdata[31:0], set23r, clk, rstn); + +// ------------------------------------------------------ +// -- set24r Register +// +// Write set24r for 'SET24R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set24r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set24r_dfflrd (set24rdft, set24rwe, wrdata[31:0], set24r, clk, rstn); + +// ------------------------------------------------------ +// -- set25r Register +// +// Write set25r for 'SET25R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set25r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set25r_dfflrd (set25rdft, set25rwe, wrdata[31:0], set25r, clk, rstn); + +// ------------------------------------------------------ +// -- set26r Register +// +// Write set26r for 'SET26R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set26r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set26r_dfflrd (set26rdft, set26rwe, wrdata[31:0], set26r, clk, rstn); + +// ------------------------------------------------------ +// -- set27r Register +// +// Write set27r for 'SET0R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set27r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set27r_dfflrd (set27rdft, set27rwe, wrdata[31:0], set27r, clk, rstn); + +// ------------------------------------------------------ +// -- set28r Register +// +// Write set28r for 'SET0R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set28r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set28r_dfflrd (set28rdft, set28rwe, wrdata[31:0], set28r, clk, rstn); + +// ------------------------------------------------------ +// -- set29r Register +// +// Write set29r for 'SET29R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set29r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set29r_dfflrd (set29rdft, set29rwe, wrdata[31:0], set29r, clk, rstn); + +// ------------------------------------------------------ +// -- set30r Register +// +// Write set30r for 'SET30R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set30r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set30r_dfflrd (set30rdft, set30rwe, wrdata[31:0], set30r, clk, rstn); + +// ------------------------------------------------------ +// -- set31r Register +// +// Write set31r for 'SET31R' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> set31r +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) set31r_dfflrd (set31rdft, set31rwe, wrdata[31:0], set31r, clk, rstn); + + + +// ------------------------------------------------------ +// -- casaddrr Register +// +// Write casaddrr for 'CASADDRR' : 3-bit register +// Register is split into the following bit fields +// +// [2:0] --> casaddrr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(3) casaddrr_dfflrd (casaddrrdft, casaddrrwe, wrdata[2:0], casaddrr, clk, rstn); + +// ------------------------------------------------------ +// -- casdwr Register +// +// Write casdwr for 'CASDWR' : 3-bit register +// Register is split into the following bit fields +// +// [2:0] --> casdwr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(3) casdwr_dfflrd (casdwrdft, casdwrwe, wrdata[2:0], casdwr, clk, rstn); + +// ------------------------------------------------------ +// -- imctr Register +// +// Write imctr for 'IMCTR' : 10-bit register +// Register is split into the following bit fields +// +// [9:0] --> imctr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(10) imctr_dfflrd (imctrdft, imctrwe, wrdata[9:0], imctr, clk, rstn); + +// ------------------------------------------------------ +// -- ibleedctr Register +// +// Write ibleedctr for 'IBLEEDCTR' : 4-bit register +// Register is split into the following bit fields +// +// [3:0] --> ibleedctr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(4) ibleedctr_dfflrd (ibleedctrdft, ibleedctrwe, wrdata[3:0], ibleedctr, clk, rstn); + +// ------------------------------------------------------ +// -- iclkcmlr Register +// +// Write iclkcmlr for 'ICLKCMLR' : 4-bit register +// Register is split into the following bit fields +// +// [3:0] --> iclkcmlr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(4) iclkcmlr_dfflrd (iclkcmlrdft, iclkcmlrwe, wrdata[3:0], iclkcmlr, clk, rstn); + +// ------------------------------------------------------ +// -- currsvr0 Register +// +// Write currsvr0 for 'CURRSVR0' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> currsvr0 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) currsvr0_dfflrd (currsvr0dft, currsvr0we, wrdata[31:0], currsvr0, clk, rstn); + +// ------------------------------------------------------ +// -- currsvr1 Register +// +// Write currsvr1 for 'CURRSVR1' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> currsvr1 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) currsvr1_dfflrd (currsvr1dft, currsvr1we, wrdata[31:0], currsvr1, clk, rstn); + + +// ------------------------------------------------------ +// -- Read data mux +// +// -- The data from the selected register is +// -- placed on a zero-padded 32-bit read data bus. +// ------------------------------------------------------ +always @(*) begin : RDDATA_PROC + rddata_reg = {32{1'b0}}; + if(rtermren == H ) rddata_reg[3 :0] = rtermr[3 :0] ; + if(prbsren == H ) rddata_reg[0 :0] = prbsr[0 :0] ; + if(set0ren == H ) rddata_reg[31:0] = set0r[31:0] ; + if(set1ren == H ) rddata_reg[31:0] = set1r[31:0] ; + if(set2ren == H ) rddata_reg[31:0] = set2r[31:0] ; + if(set3ren == H ) rddata_reg[31:0] = set3r[31:0] ; + if(set4ren == H ) rddata_reg[31:0] = set4r[31:0] ; + if(set5ren == H ) rddata_reg[31:0] = set5r[31:0] ; + if(set6ren == H ) rddata_reg[31:0] = set6r[31:0] ; + if(set7ren == H ) rddata_reg[31:0] = set7r[31:0] ; + if(set8ren == H ) rddata_reg[31:0] = set8r[31:0] ; + if(set9ren == H ) rddata_reg[31:0] = set9r[31:0] ; + if(set10ren == H ) rddata_reg[31:0] = set10r[31:0] ; + if(set11ren == H ) rddata_reg[31:0] = set11r[31:0] ; + if(set12ren == H ) rddata_reg[31:0] = set12r[31:0] ; + if(set13ren == H ) rddata_reg[31:0] = set13r[31:0] ; + if(set14ren == H ) rddata_reg[31:0] = set14r[31:0] ; + if(set15ren == H ) rddata_reg[31:0] = set15r[31:0] ; + if(set16ren == H ) rddata_reg[31:0] = set16r[31:0] ; + if(set17ren == H ) rddata_reg[31:0] = set17r[31:0] ; + if(set18ren == H ) rddata_reg[31:0] = set18r[31:0] ; + if(set19ren == H ) rddata_reg[31:0] = set19r[31:0] ; + if(set20ren == H ) rddata_reg[31:0] = set20r[31:0] ; + if(set21ren == H ) rddata_reg[31:0] = set21r[31:0] ; + if(set22ren == H ) rddata_reg[31:0] = set22r[31:0] ; + if(set23ren == H ) rddata_reg[31:0] = set23r[31:0] ; + if(set24ren == H ) rddata_reg[31:0] = set24r[31:0] ; + if(set25ren == H ) rddata_reg[31:0] = set25r[31:0] ; + if(set26ren == H ) rddata_reg[31:0] = set26r[31:0] ; + if(set27ren == H ) rddata_reg[31:0] = set27r[31:0] ; + if(set28ren == H ) rddata_reg[31:0] = set28r[31:0] ; + if(set29ren == H ) rddata_reg[31:0] = set29r[31:0] ; + if(set30ren == H ) rddata_reg[31:0] = set30r[31:0] ; + if(set31ren == H ) rddata_reg[31:0] = set31r[31:0] ; + if(casaddrren == H ) rddata_reg[2 :0] = casaddrr[2 :0] ; + if(casdwren == H ) rddata_reg[2 :0] = casdwr[2 :0] ; + if(imctren == H ) rddata_reg[9 :0] = imctr[9 :0] ; + if(ibleedctren == H ) rddata_reg[3 :0] = ibleedctr[3 :0] ; + if(iclkcmlren == H ) rddata_reg[3 :0] = iclkcmlr[3 :0] ; + if(currsvr0en == H ) rddata_reg[31:0] = currsvr0[31:0] ; + if(currsvr1en == H ) rddata_reg[31:0] = currsvr1[31:0] ; + if(verren == H ) rddata_reg[31:0] = DACVERSION ; +end + +//rddata +sirv_gnrl_dffr #(32) rddata_dffr (rddata_reg, rddata, clk, rstn); + +// ------------------------------------------------------ +// -- Output signals assignment +// ------------------------------------------------------ +assign Rterm = rtermr ; // R_Terminate +assign PrbsEn = prbsr ; // Prbs_en +assign Set[0] = set0r[14: 0] ; +assign Set[1] = set0r[30:16] ; +assign Set[2] = set1r[14: 0] ; +assign Set[3] = set1r[30:16] ; +assign Set[4] = set2r[14: 0] ; +assign Set[5] = set2r[30:16] ; +assign Set[6] = set3r[14: 0] ; +assign Set[7] = set3r[30:16] ; +assign Set[8] = set4r[14: 0] ; +assign Set[9] = set4r[30:16] ; +assign Set[10] = set5r[14: 0] ; +assign Set[11] = set5r[30:16] ; +assign Set[12] = set6r[14: 0] ; +assign Set[13] = set6r[30:16] ; +assign Set[14] = set7r[14: 0] ; +assign Set[15] = set7r[30:16] ; +assign Set[16] = set8r[14: 0] ; +assign Set[17] = set8r[30:16] ; +assign Set[18] = set9r[14: 0] ; +assign Set[19] = set9r[30:16] ; +assign Set[20] = set10r[14: 0] ; +assign Set[21] = set10r[30:16] ; +assign Set[22] = set11r[14: 0] ; +assign Set[23] = set11r[30:16] ; +assign Set[24] = set12r[14: 0] ; +assign Set[25] = set12r[30:16] ; +assign Set[26] = set13r[14: 0] ; +assign Set[27] = set13r[30:16] ; +assign Set[28] = set14r[14: 0] ; +assign Set[29] = set14r[30:16] ; +assign Set[30] = set15r[14: 0] ; +assign Set[31] = set15r[30:16] ; +assign Set[32] = set16r[14: 0] ; +assign Set[33] = set16r[30:16] ; +assign Set[34] = set17r[14: 0] ; +assign Set[35] = set17r[30:16] ; +assign Set[36] = set18r[14: 0] ; +assign Set[37] = set18r[30:16] ; +assign Set[38] = set19r[14: 0] ; +assign Set[39] = set19r[30:16] ; +assign Set[40] = set20r[14: 0] ; +assign Set[41] = set20r[30:16] ; +assign Set[42] = set21r[14: 0] ; +assign Set[43] = set21r[30:16] ; +assign Set[44] = set22r[14: 0] ; +assign Set[45] = set22r[30:16] ; +assign Set[46] = set23r[14: 0] ; +assign Set[47] = set23r[30:16] ; +assign Set[48] = set24r[14: 0] ; +assign Set[49] = set24r[30:16] ; +assign Set[50] = set25r[14: 0] ; +assign Set[51] = set25r[30:16] ; +assign Set[52] = set26r[14: 0] ; +assign Set[53] = set26r[30:16] ; +assign Set[54] = set27r[14: 0] ; +assign Set[55] = set27r[30:16] ; +assign Set[56] = set28r[14: 0] ; +assign Set[57] = set28r[30:16] ; +assign Set[58] = set29r[14: 0] ; +assign Set[59] = set29r[30:16] ; +assign Set[60] = set30r[14: 0] ; +assign Set[61] = set30r[30:16] ; +assign Set[62] = set31r[14: 0] ; +assign Set[63] = set31r[30:16] ; + + +assign CasAddr = casaddrr ; +assign CasDw = casdwr ; +assign IMainCtrl = imctr ; +assign IBleedCtrl = ibleedctr ; +assign ICkCml = iclkcmlr ; +assign CurRsv0 = currsvr0 ; +assign CurRsv1 = currsvr1 ; + +endmodule + +`undef RTERMR +`undef PRBSENR +`undef SET0R +`undef SET1R +`undef SET2R +`undef SET3R +`undef SET4R +`undef SET5R +`undef SET6R +`undef SET7R +`undef SET8R +`undef SET9R +`undef SET10R +`undef SET11R +`undef SET12R +`undef SET13R +`undef SET14R +`undef SET15R +`undef SET16R +`undef SET17R +`undef SET18R +`undef SET19R +`undef SET20R +`undef SET21R +`undef SET22R +`undef SET23R +`undef SET24R +`undef SET25R +`undef SET26R +`undef SET27R +`undef SET28R +`undef SET29R +`undef SET30R +`undef SET31R +`undef CASADDRR +`undef CASDWR +`undef IMCTR +`undef IBLEEDCTR +`undef ICLKCMLR +`undef CURRSVR0 +`undef CURRSVR1 +`undef VERSIONR + + + diff --git a/DA4008_V1.2/rtl/dacif/dacif.v b/DA4008_V1.2/rtl/dacif/dacif.v new file mode 100644 index 0000000..6f0fc1d --- /dev/null +++ b/DA4008_V1.2/rtl/dacif/dacif.v @@ -0,0 +1,83 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : dacif.v +// Department : +// Author : PWY +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 0.4 2024-03-12 PWY +// 0.9 2024-06-19 PWY Add 2x, 4x, and 8x interpolation modes to EZQ2.0S. +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +module dacif ( + input clk + ,input rstn + ,input din_vld + ,output dout_vld + //mixer data input + ,input [7:0] din [63:0] + //data output + ,output [7:0] dout[63:0] +); + +wire[1 :0] dacif_vld_dly; +sirv_gnrl_dffr #(2) dacif_vld_dffr ({dacif_vld_dly[0], din_vld}, dacif_vld_dly, clk, rstn); + +//////////////////////////////////////////////////// +// regs +//////////////////////////////////////////////////// + +wire[7:0] mux_p [63:0]; + +wire[7:0] dout_w [63:0]; + +genvar k; +generate + + for(k = 0; k < 64; k = k + 1) begin + + sirv_gnrl_dfflr #(8) mux_dfflr (1'b1, {~din[k][7], din[k][6:0]}, mux_p[k], clk, rstn); + + end +endgenerate + + +genvar m; +generate + //////////////////////////////////////////////////// + // mode select + //////////////////////////////////////////////////// + for(m = 0; m < 64; m = m + 1) begin + + assign dout_w[m] = mux_p [m] ; + sirv_gnrl_dfflrd #(8) dout_dfflrd (8'h80, 1'b1, dout_w[m], dout[m], clk, rstn); + + end +endgenerate + +assign dout_vld = dacif_vld_dly[1]; + +endmodule diff --git a/DA4008_V1.2/rtl/define/chip_define.v b/DA4008_V1.2/rtl/define/chip_define.v new file mode 100644 index 0000000..07d7feb --- /dev/null +++ b/DA4008_V1.2/rtl/define/chip_define.v @@ -0,0 +1,15 @@ + +//Defining Memory Types + +//`define BEHAVIOR_SIM +//`define XILINX_FPGA +`define TSMC_IC + +//Setting the Number of SPI Slave Devices +`define SLVNUM 4 +//Whether SPI Bus Commands Are Buffered +`define SPIBUS_CMD_REG 1 +//Whether SPI Bus Readout Are Buffered +`define SPIBUS_OUT_REG 0 +//Whether Mod mux dout Are Buffered +//`define MODDOUT_MUX_REG \ No newline at end of file diff --git a/DA4008_V1.2/rtl/define/chip_undefine.v b/DA4008_V1.2/rtl/define/chip_undefine.v new file mode 100644 index 0000000..4e77574 --- /dev/null +++ b/DA4008_V1.2/rtl/define/chip_undefine.v @@ -0,0 +1,16 @@ + +//`undef BEHAVIOR_SIM +//`undef XILINX_FPGA +`undef TSMC_IC +//Is the chip a 4-channel one? +//`undef CHANNEL_IS_FOUR + +//Setting the Number of SPI Slave Devices +`undef SLVNUM +//Whether SPI Bus Commands Are Buffered +`undef SPIBUS_CMD_REG +//Whether SPI Bus Readout Are Buffered +`undef SPIBUS_OUT_REG + +//Whether Mod mux dout Are Buffered +//`undef MODDOUT_MUX_REG \ No newline at end of file diff --git a/DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v b/DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v new file mode 100644 index 0000000..815b2f1 --- /dev/null +++ b/DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v @@ -0,0 +1,116 @@ +module DA4008_DEM_Parallel_PRBS_1CH ( clk, + data_in, + prbs_en, + set, + MSB_DUM_IN, + DEM_LSB_OUT, + DEM_MSB_OUT, + DEM_MSB_DUM + +); + + + +input clk, prbs_en; +input [7:0] data_in; +input [14:0] set; +input MSB_DUM_IN; +output [4:0] DEM_LSB_OUT; +output [6:0] DEM_MSB_OUT; +output DEM_MSB_DUM; + + +reg [14:0]r_shift_data; + +always @(posedge clk or negedge prbs_en) +begin + if(!prbs_en) + + r_shift_data <=set; + + else + + begin + + r_shift_data[0] <=r_shift_data[3]; + + r_shift_data[1] <= r_shift_data[4]; + + r_shift_data[2] <= r_shift_data[5]; + + r_shift_data[3] <= r_shift_data[6]; + + r_shift_data[4] <= r_shift_data[7]; + + r_shift_data[5] <= r_shift_data[8]; + + r_shift_data[6] <= r_shift_data[9]; + + r_shift_data[7] <= r_shift_data[10]; + + r_shift_data[8] <= r_shift_data[11]; + + r_shift_data[9] <= r_shift_data[12]; + + r_shift_data[10] <= r_shift_data[13]; + + r_shift_data[11] <= r_shift_data[14]; + + r_shift_data[12] <= r_shift_data[0]^r_shift_data[1]; + + r_shift_data[13] <= r_shift_data[2]^r_shift_data[1]; + + r_shift_data[14] <= r_shift_data[3]^r_shift_data[2]; + end +end + +wire [2:0]dd; + +assign dd = {r_shift_data[0],r_shift_data[1], r_shift_data[2]}; + +reg [6:0] r_MSB_BUF0; + +always @(posedge clk) + +begin + + case(dd[2:0]) + + 3'd0: r_MSB_BUF0 <= {data_in[7],data_in[7],data_in[7],data_in[7],data_in[6],data_in[6],data_in[5]}; + + 3'd1: r_MSB_BUF0 <= {data_in[7],data_in[7],data_in[7],data_in[6],data_in[6],data_in[5],data_in[7]}; + + 3'd2: r_MSB_BUF0 <= {data_in[7],data_in[7],data_in[6],data_in[6],data_in[5],data_in[7],data_in[7]}; + + 3'd3: r_MSB_BUF0 <= {data_in[7],data_in[6],data_in[6],data_in[5],data_in[7],data_in[7],data_in[7]}; + + 3'd4: r_MSB_BUF0 <= {data_in[6],data_in[6],data_in[5],data_in[7],data_in[7],data_in[7],data_in[7]}; + + 3'd5: r_MSB_BUF0 <= {data_in[6],data_in[5],data_in[7],data_in[7],data_in[7],data_in[7],data_in[6]}; + + 3'd6: r_MSB_BUF0 <= {data_in[5],data_in[7],data_in[7],data_in[7],data_in[7],data_in[6],data_in[6]}; + + 3'd7: r_MSB_BUF0 <= {data_in[7],data_in[7],data_in[7],data_in[7],data_in[6],data_in[6],data_in[5]}; + + endcase + +end + +reg [4:0] r_LSB_BUF0; +reg r_DUM_BUF; + +always @(posedge clk) + +begin + + r_LSB_BUF0 <= {data_in[4],data_in[3],data_in[2],data_in[1],data_in[0]}; + r_DUM_BUF <= MSB_DUM_IN; + +end + +assign DEM_LSB_OUT = r_LSB_BUF0; +assign DEM_MSB_DUM = r_DUM_BUF; +assign DEM_MSB_OUT = r_MSB_BUF0; + + +endmodule diff --git a/DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v b/DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v new file mode 100644 index 0000000..57b13bf --- /dev/null +++ b/DA4008_V1.2/rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v @@ -0,0 +1,1028 @@ +module DA4008_DEM_Parallel_PRBS_64CH ( + input clk + ,input prbs_en + ,input RST_N + + ,input [14:0] dem_set_0 + ,input [14:0] dem_set_1 + ,input [14:0] dem_set_2 + ,input [14:0] dem_set_3 + ,input [14:0] dem_set_4 + ,input [14:0] dem_set_5 + ,input [14:0] dem_set_6 + ,input [14:0] dem_set_7 + ,input [14:0] dem_set_8 + ,input [14:0] dem_set_9 + ,input [14:0] dem_set_10 + ,input [14:0] dem_set_11 + ,input [14:0] dem_set_12 + ,input [14:0] dem_set_13 + ,input [14:0] dem_set_14 + ,input [14:0] dem_set_15 + ,input [14:0] dem_set_16 + ,input [14:0] dem_set_17 + ,input [14:0] dem_set_18 + ,input [14:0] dem_set_19 + ,input [14:0] dem_set_20 + ,input [14:0] dem_set_21 + ,input [14:0] dem_set_22 + ,input [14:0] dem_set_23 + ,input [14:0] dem_set_24 + ,input [14:0] dem_set_25 + ,input [14:0] dem_set_26 + ,input [14:0] dem_set_27 + ,input [14:0] dem_set_28 + ,input [14:0] dem_set_29 + ,input [14:0] dem_set_30 + ,input [14:0] dem_set_31 + ,input [14:0] dem_set_32 + ,input [14:0] dem_set_33 + ,input [14:0] dem_set_34 + ,input [14:0] dem_set_35 + ,input [14:0] dem_set_36 + ,input [14:0] dem_set_37 + ,input [14:0] dem_set_38 + ,input [14:0] dem_set_39 + ,input [14:0] dem_set_40 + ,input [14:0] dem_set_41 + ,input [14:0] dem_set_42 + ,input [14:0] dem_set_43 + ,input [14:0] dem_set_44 + ,input [14:0] dem_set_45 + ,input [14:0] dem_set_46 + ,input [14:0] dem_set_47 + ,input [14:0] dem_set_48 + ,input [14:0] dem_set_49 + ,input [14:0] dem_set_50 + ,input [14:0] dem_set_51 + ,input [14:0] dem_set_52 + ,input [14:0] dem_set_53 + ,input [14:0] dem_set_54 + ,input [14:0] dem_set_55 + ,input [14:0] dem_set_56 + ,input [14:0] dem_set_57 + ,input [14:0] dem_set_58 + ,input [14:0] dem_set_59 + ,input [14:0] dem_set_60 + ,input [14:0] dem_set_61 + ,input [14:0] dem_set_62 + ,input [14:0] dem_set_63 + + + ,input [7:0] data_in_0 + ,input [7:0] data_in_1 + ,input [7:0] data_in_2 + ,input [7:0] data_in_3 + ,input [7:0] data_in_4 + ,input [7:0] data_in_5 + ,input [7:0] data_in_6 + ,input [7:0] data_in_7 + ,input [7:0] data_in_8 + ,input [7:0] data_in_9 + ,input [7:0] data_in_10 + ,input [7:0] data_in_11 + ,input [7:0] data_in_12 + ,input [7:0] data_in_13 + ,input [7:0] data_in_14 + ,input [7:0] data_in_15 + ,input [7:0] data_in_16 + ,input [7:0] data_in_17 + ,input [7:0] data_in_18 + ,input [7:0] data_in_19 + ,input [7:0] data_in_20 + ,input [7:0] data_in_21 + ,input [7:0] data_in_22 + ,input [7:0] data_in_23 + ,input [7:0] data_in_24 + ,input [7:0] data_in_25 + ,input [7:0] data_in_26 + ,input [7:0] data_in_27 + ,input [7:0] data_in_28 + ,input [7:0] data_in_29 + ,input [7:0] data_in_30 + ,input [7:0] data_in_31 + ,input [7:0] data_in_32 + ,input [7:0] data_in_33 + ,input [7:0] data_in_34 + ,input [7:0] data_in_35 + ,input [7:0] data_in_36 + ,input [7:0] data_in_37 + ,input [7:0] data_in_38 + ,input [7:0] data_in_39 + ,input [7:0] data_in_40 + ,input [7:0] data_in_41 + ,input [7:0] data_in_42 + ,input [7:0] data_in_43 + ,input [7:0] data_in_44 + ,input [7:0] data_in_45 + ,input [7:0] data_in_46 + ,input [7:0] data_in_47 + ,input [7:0] data_in_48 + ,input [7:0] data_in_49 + ,input [7:0] data_in_50 + ,input [7:0] data_in_51 + ,input [7:0] data_in_52 + ,input [7:0] data_in_53 + ,input [7:0] data_in_54 + ,input [7:0] data_in_55 + ,input [7:0] data_in_56 + ,input [7:0] data_in_57 + ,input [7:0] data_in_58 + ,input [7:0] data_in_59 + ,input [7:0] data_in_60 + ,input [7:0] data_in_61 + ,input [7:0] data_in_62 + ,input [7:0] data_in_63 + + + + + ,output [6:0] DEM_MSB_OUT_0 + ,output [6:0] DEM_MSB_OUT_1 + ,output [6:0] DEM_MSB_OUT_2 + ,output [6:0] DEM_MSB_OUT_3 + ,output [6:0] DEM_MSB_OUT_4 + ,output [6:0] DEM_MSB_OUT_5 + ,output [6:0] DEM_MSB_OUT_6 + ,output [6:0] DEM_MSB_OUT_7 + ,output [6:0] DEM_MSB_OUT_8 + ,output [6:0] DEM_MSB_OUT_9 + ,output [6:0] DEM_MSB_OUT_10 + ,output [6:0] DEM_MSB_OUT_11 + ,output [6:0] DEM_MSB_OUT_12 + ,output [6:0] DEM_MSB_OUT_13 + ,output [6:0] DEM_MSB_OUT_14 + ,output [6:0] DEM_MSB_OUT_15 + ,output [6:0] DEM_MSB_OUT_16 + ,output [6:0] DEM_MSB_OUT_17 + ,output [6:0] DEM_MSB_OUT_18 + ,output [6:0] DEM_MSB_OUT_19 + ,output [6:0] DEM_MSB_OUT_20 + ,output [6:0] DEM_MSB_OUT_21 + ,output [6:0] DEM_MSB_OUT_22 + ,output [6:0] DEM_MSB_OUT_23 + ,output [6:0] DEM_MSB_OUT_24 + ,output [6:0] DEM_MSB_OUT_25 + ,output [6:0] DEM_MSB_OUT_26 + ,output [6:0] DEM_MSB_OUT_27 + ,output [6:0] DEM_MSB_OUT_28 + ,output [6:0] DEM_MSB_OUT_29 + ,output [6:0] DEM_MSB_OUT_30 + ,output [6:0] DEM_MSB_OUT_31 + ,output [6:0] DEM_MSB_OUT_32 + ,output [6:0] DEM_MSB_OUT_33 + ,output [6:0] DEM_MSB_OUT_34 + ,output [6:0] DEM_MSB_OUT_35 + ,output [6:0] DEM_MSB_OUT_36 + ,output [6:0] DEM_MSB_OUT_37 + ,output [6:0] DEM_MSB_OUT_38 + ,output [6:0] DEM_MSB_OUT_39 + ,output [6:0] DEM_MSB_OUT_40 + ,output [6:0] DEM_MSB_OUT_41 + ,output [6:0] DEM_MSB_OUT_42 + ,output [6:0] DEM_MSB_OUT_43 + ,output [6:0] DEM_MSB_OUT_44 + ,output [6:0] DEM_MSB_OUT_45 + ,output [6:0] DEM_MSB_OUT_46 + ,output [6:0] DEM_MSB_OUT_47 + ,output [6:0] DEM_MSB_OUT_48 + ,output [6:0] DEM_MSB_OUT_49 + ,output [6:0] DEM_MSB_OUT_50 + ,output [6:0] DEM_MSB_OUT_51 + ,output [6:0] DEM_MSB_OUT_52 + ,output [6:0] DEM_MSB_OUT_53 + ,output [6:0] DEM_MSB_OUT_54 + ,output [6:0] DEM_MSB_OUT_55 + ,output [6:0] DEM_MSB_OUT_56 + ,output [6:0] DEM_MSB_OUT_57 + ,output [6:0] DEM_MSB_OUT_58 + ,output [6:0] DEM_MSB_OUT_59 + ,output [6:0] DEM_MSB_OUT_60 + ,output [6:0] DEM_MSB_OUT_61 + ,output [6:0] DEM_MSB_OUT_62 + ,output [6:0] DEM_MSB_OUT_63 + + + + ,output [4:0] DEM_LSB_OUT_0 + ,output [4:0] DEM_LSB_OUT_1 + ,output [4:0] DEM_LSB_OUT_2 + ,output [4:0] DEM_LSB_OUT_3 + ,output [4:0] DEM_LSB_OUT_4 + ,output [4:0] DEM_LSB_OUT_5 + ,output [4:0] DEM_LSB_OUT_6 + ,output [4:0] DEM_LSB_OUT_7 + ,output [4:0] DEM_LSB_OUT_8 + ,output [4:0] DEM_LSB_OUT_9 + ,output [4:0] DEM_LSB_OUT_10 + ,output [4:0] DEM_LSB_OUT_11 + ,output [4:0] DEM_LSB_OUT_12 + ,output [4:0] DEM_LSB_OUT_13 + ,output [4:0] DEM_LSB_OUT_14 + ,output [4:0] DEM_LSB_OUT_15 + ,output [4:0] DEM_LSB_OUT_16 + ,output [4:0] DEM_LSB_OUT_17 + ,output [4:0] DEM_LSB_OUT_18 + ,output [4:0] DEM_LSB_OUT_19 + ,output [4:0] DEM_LSB_OUT_20 + ,output [4:0] DEM_LSB_OUT_21 + ,output [4:0] DEM_LSB_OUT_22 + ,output [4:0] DEM_LSB_OUT_23 + ,output [4:0] DEM_LSB_OUT_24 + ,output [4:0] DEM_LSB_OUT_25 + ,output [4:0] DEM_LSB_OUT_26 + ,output [4:0] DEM_LSB_OUT_27 + ,output [4:0] DEM_LSB_OUT_28 + ,output [4:0] DEM_LSB_OUT_29 + ,output [4:0] DEM_LSB_OUT_30 + ,output [4:0] DEM_LSB_OUT_31 + ,output [4:0] DEM_LSB_OUT_32 + ,output [4:0] DEM_LSB_OUT_33 + ,output [4:0] DEM_LSB_OUT_34 + ,output [4:0] DEM_LSB_OUT_35 + ,output [4:0] DEM_LSB_OUT_36 + ,output [4:0] DEM_LSB_OUT_37 + ,output [4:0] DEM_LSB_OUT_38 + ,output [4:0] DEM_LSB_OUT_39 + ,output [4:0] DEM_LSB_OUT_40 + ,output [4:0] DEM_LSB_OUT_41 + ,output [4:0] DEM_LSB_OUT_42 + ,output [4:0] DEM_LSB_OUT_43 + ,output [4:0] DEM_LSB_OUT_44 + ,output [4:0] DEM_LSB_OUT_45 + ,output [4:0] DEM_LSB_OUT_46 + ,output [4:0] DEM_LSB_OUT_47 + ,output [4:0] DEM_LSB_OUT_48 + ,output [4:0] DEM_LSB_OUT_49 + ,output [4:0] DEM_LSB_OUT_50 + ,output [4:0] DEM_LSB_OUT_51 + ,output [4:0] DEM_LSB_OUT_52 + ,output [4:0] DEM_LSB_OUT_53 + ,output [4:0] DEM_LSB_OUT_54 + ,output [4:0] DEM_LSB_OUT_55 + ,output [4:0] DEM_LSB_OUT_56 + ,output [4:0] DEM_LSB_OUT_57 + ,output [4:0] DEM_LSB_OUT_58 + ,output [4:0] DEM_LSB_OUT_59 + ,output [4:0] DEM_LSB_OUT_60 + ,output [4:0] DEM_LSB_OUT_61 + ,output [4:0] DEM_LSB_OUT_62 + ,output [4:0] DEM_LSB_OUT_63 + ,output DEM_MSB_DUM_0 + ,output DEM_MSB_DUM_1 + ,output DEM_MSB_DUM_2 + ,output DEM_MSB_DUM_3 + ,output DEM_MSB_DUM_4 + ,output DEM_MSB_DUM_5 + ,output DEM_MSB_DUM_6 + ,output DEM_MSB_DUM_7 + ,output DEM_MSB_DUM_8 + ,output DEM_MSB_DUM_9 + ,output DEM_MSB_DUM_10 + ,output DEM_MSB_DUM_11 + ,output DEM_MSB_DUM_12 + ,output DEM_MSB_DUM_13 + ,output DEM_MSB_DUM_14 + ,output DEM_MSB_DUM_15 + ,output DEM_MSB_DUM_16 + ,output DEM_MSB_DUM_17 + ,output DEM_MSB_DUM_18 + ,output DEM_MSB_DUM_19 + ,output DEM_MSB_DUM_20 + ,output DEM_MSB_DUM_21 + ,output DEM_MSB_DUM_22 + ,output DEM_MSB_DUM_23 + ,output DEM_MSB_DUM_24 + ,output DEM_MSB_DUM_25 + ,output DEM_MSB_DUM_26 + ,output DEM_MSB_DUM_27 + ,output DEM_MSB_DUM_28 + ,output DEM_MSB_DUM_29 + ,output DEM_MSB_DUM_30 + ,output DEM_MSB_DUM_31 + ,output DEM_MSB_DUM_32 + ,output DEM_MSB_DUM_33 + ,output DEM_MSB_DUM_34 + ,output DEM_MSB_DUM_35 + ,output DEM_MSB_DUM_36 + ,output DEM_MSB_DUM_37 + ,output DEM_MSB_DUM_38 + ,output DEM_MSB_DUM_39 + ,output DEM_MSB_DUM_40 + ,output DEM_MSB_DUM_41 + ,output DEM_MSB_DUM_42 + ,output DEM_MSB_DUM_43 + ,output DEM_MSB_DUM_44 + ,output DEM_MSB_DUM_45 + ,output DEM_MSB_DUM_46 + ,output DEM_MSB_DUM_47 + ,output DEM_MSB_DUM_48 + ,output DEM_MSB_DUM_49 + ,output DEM_MSB_DUM_50 + ,output DEM_MSB_DUM_51 + ,output DEM_MSB_DUM_52 + ,output DEM_MSB_DUM_53 + ,output DEM_MSB_DUM_54 + ,output DEM_MSB_DUM_55 + ,output DEM_MSB_DUM_56 + ,output DEM_MSB_DUM_57 + ,output DEM_MSB_DUM_58 + ,output DEM_MSB_DUM_59 + ,output DEM_MSB_DUM_60 + ,output DEM_MSB_DUM_61 + ,output DEM_MSB_DUM_62 + ,output DEM_MSB_DUM_63 +); + + + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_0 ( + .clk ( clk ) + ,.data_in ( data_in_0 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_0 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_0 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_0 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_0 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_1 ( + .clk ( clk ) + ,.data_in ( data_in_1 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_1 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_1 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_1 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_1 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_2 ( + .clk ( clk ) + ,.data_in ( data_in_2 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_2 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_2 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_2 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_2 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_3 ( + .clk ( clk ) + ,.data_in ( data_in_3 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_3 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_3 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_3 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_3 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_4 ( + .clk ( clk ) + ,.data_in ( data_in_4 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_4 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_4 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_4 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_4 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_5 ( + .clk ( clk ) + ,.data_in ( data_in_5 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_5 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_5 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_5 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_5 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_6 ( + .clk ( clk ) + ,.data_in ( data_in_6 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_6 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_6 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_6 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_6 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_7 ( + .clk ( clk ) + ,.data_in ( data_in_7 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_7 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_7 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_7 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_7 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_8 ( + .clk ( clk ) + ,.data_in ( data_in_8 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_8 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_8 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_8 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_8 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_9 ( + .clk ( clk ) + ,.data_in ( data_in_9 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_9 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_9 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_9 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_9 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_10 ( + .clk ( clk ) + ,.data_in ( data_in_10 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_10 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_10 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_10 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_10 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_11 ( + .clk ( clk ) + ,.data_in ( data_in_11 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_11 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_11 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_11 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_11 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_12 ( + .clk ( clk ) + ,.data_in ( data_in_12 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_12 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_12 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_12 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_12 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_13 ( + .clk ( clk ) + ,.data_in ( data_in_13 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_13 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_13 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_13 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_13 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_14 ( + .clk ( clk ) + ,.data_in ( data_in_14 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_14 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_14 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_14 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_14 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_15 ( + .clk ( clk ) + ,.data_in ( data_in_15 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_15 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_15 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_15 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_15 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_16 ( + .clk ( clk ) + ,.data_in ( data_in_16 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_16 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_16 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_16 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_16 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_17 ( + .clk ( clk ) + ,.data_in ( data_in_17 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_17 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_17 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_17 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_17 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_18 ( + .clk ( clk ) + ,.data_in ( data_in_18 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_18 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_18 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_18 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_18 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_19 ( + .clk ( clk ) + ,.data_in ( data_in_19 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_19 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_19 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_19 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_19 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_20 ( + .clk ( clk ) + ,.data_in ( data_in_20 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_20 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_20 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_20 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_20 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_21 ( + .clk ( clk ) + ,.data_in ( data_in_21 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_21 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_21 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_21 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_21 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_22 ( + .clk ( clk ) + ,.data_in ( data_in_22 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_22 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_22 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_22 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_22 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_23 ( + .clk ( clk ) + ,.data_in ( data_in_23 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_23 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_23 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_23 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_23 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_24 ( + .clk ( clk ) + ,.data_in ( data_in_24 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_24 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_24 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_24 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_24 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_25 ( + .clk ( clk ) + ,.data_in ( data_in_25 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_25 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_25 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_25 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_25 ) +); +DA4008_DEM_Parallel_PRBS_1CH inst_dem_26 ( + .clk ( clk ) + ,.data_in ( data_in_26 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_26 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_26 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_26 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_26 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_27 ( + .clk ( clk ) + ,.data_in ( data_in_27 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_27 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_27 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_27 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_27 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_28 ( + .clk ( clk ) + ,.data_in ( data_in_28 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_28 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_28 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_28 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_28 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_29 ( + .clk ( clk ) + ,.data_in ( data_in_29 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_29 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_29 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_29 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_29 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_30 ( + .clk ( clk ) + ,.data_in ( data_in_30 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_30 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_30 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_30 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_30 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_31 ( + .clk ( clk ) + ,.data_in ( data_in_31 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_31 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_31 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_31 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_31 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_32 ( + .clk ( clk ) + ,.data_in ( data_in_32 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_32 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_32 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_32 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_32 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_33 ( + .clk ( clk ) + ,.data_in ( data_in_33 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_33 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_33 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_33 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_33 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_34 ( + .clk ( clk ) + ,.data_in ( data_in_34 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_34 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_34 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_34 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_34 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_35 ( + .clk ( clk ) + ,.data_in ( data_in_35 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_35 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_35 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_35 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_35 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_36 ( + .clk ( clk ) + ,.data_in ( data_in_36 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_36 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_36 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_36 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_36 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_37 ( + .clk ( clk ) + ,.data_in ( data_in_37 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_37 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_37 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_37 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_37 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_38 ( + .clk ( clk ) + ,.data_in ( data_in_38 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_38 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_38 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_38 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_38 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_39 ( + .clk ( clk ) + ,.data_in ( data_in_39 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_39 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_39 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_39 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_39 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_40 ( + .clk ( clk ) + ,.data_in ( data_in_40 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_40 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_40 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_40 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_40 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_41 ( + .clk ( clk ) + ,.data_in ( data_in_41 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_41 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_41 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_41 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_41 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_42 ( + .clk ( clk ) + ,.data_in ( data_in_42 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_42 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_42 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_42 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_42 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_43 ( + .clk ( clk ) + ,.data_in ( data_in_43 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_43 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_43 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_43 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_43 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_44 ( + .clk ( clk ) + ,.data_in ( data_in_44 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_44 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_44 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_44 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_44 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_45 ( + .clk ( clk ) + ,.data_in ( data_in_45 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_45 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_45 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_45 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_45 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_46 ( + .clk ( clk ) + ,.data_in ( data_in_46 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_46 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_46 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_46 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_46 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_47 ( + .clk ( clk ) + ,.data_in ( data_in_47 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_47 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_47 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_47 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_47 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_48 ( + .clk ( clk ) + ,.data_in ( data_in_48 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_48 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_48 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_48 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_48 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_49 ( + .clk ( clk ) + ,.data_in ( data_in_49 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_49 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_49 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_49 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_49 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_50 ( + .clk ( clk ) + ,.data_in ( data_in_50 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_50 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_50 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_50 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_50 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_51 ( + .clk ( clk ) + ,.data_in ( data_in_51 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_51 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_51 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_51 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_51 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_52 ( + .clk ( clk ) + ,.data_in ( data_in_52 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_52 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_52 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_52 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_52 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_53 ( + .clk ( clk ) + ,.data_in ( data_in_53 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_53 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_53 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_53 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_53 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_54 ( + .clk ( clk ) + ,.data_in ( data_in_54 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_54 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_54 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_54 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_54 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_55 ( + .clk ( clk ) + ,.data_in ( data_in_55 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_55 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_55 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_55 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_55 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_56 ( + .clk ( clk ) + ,.data_in ( data_in_56 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_56 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_56 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_56 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_56 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_57 ( + .clk ( clk ) + ,.data_in ( data_in_57 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_57 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_57 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_57 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_57 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_58 ( + .clk ( clk ) + ,.data_in ( data_in_58 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_58 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_58 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_58 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_58 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_59 ( + .clk ( clk ) + ,.data_in ( data_in_59 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_59 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_59 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_59 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_59 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_60 ( + .clk ( clk ) + ,.data_in ( data_in_60 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_60 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_60 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_60 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_60 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_61 ( + .clk ( clk ) + ,.data_in ( data_in_61 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_61 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_61 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_61 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_61 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_62 ( + .clk ( clk ) + ,.data_in ( data_in_62 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_62 ) + ,.MSB_DUM_IN ( 1'b0 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_62 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_62 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_62 ) +); + +DA4008_DEM_Parallel_PRBS_1CH inst_dem_63 ( + .clk ( clk ) + ,.data_in ( data_in_63 ) + ,.prbs_en ( prbs_en ) + ,.set ( dem_set_63 ) + ,.MSB_DUM_IN ( 1'b1 ) + ,.DEM_LSB_OUT ( DEM_LSB_OUT_63 ) + ,.DEM_MSB_OUT ( DEM_MSB_OUT_63 ) + ,.DEM_MSB_DUM ( DEM_MSB_DUM_63 ) +); + + + + +endmodule diff --git a/DA4008_V1.2/rtl/dem/DEM_PhaseSync_4008.sv b/DA4008_V1.2/rtl/dem/DEM_PhaseSync_4008.sv new file mode 100644 index 0000000..93aa317 --- /dev/null +++ b/DA4008_V1.2/rtl/dem/DEM_PhaseSync_4008.sv @@ -0,0 +1,1361 @@ +module DEM_PhaseSync_4008 ( + input clk + ,input prbs_en + ,input RST_N + ,input [14:0] dem_set [63:0] + + ,input [7:0] data_in [63:0] + + ,output [6:0] MSB_OUT [63:0] + + ,output [4:0] LSB_OUT [63:0] + + ,output MSB_DUM [63:0] + +); + +wire [6:0] DEM_MSB_OUT_0 ; +wire [6:0] DEM_MSB_OUT_1 ; +wire [6:0] DEM_MSB_OUT_2 ; +wire [6:0] DEM_MSB_OUT_3 ; +wire [6:0] DEM_MSB_OUT_4 ; +wire [6:0] DEM_MSB_OUT_5 ; +wire [6:0] DEM_MSB_OUT_6 ; +wire [6:0] DEM_MSB_OUT_7 ; +wire [6:0] DEM_MSB_OUT_8 ; +wire [6:0] DEM_MSB_OUT_9 ; +wire [6:0] DEM_MSB_OUT_10 ; +wire [6:0] DEM_MSB_OUT_11 ; +wire [6:0] DEM_MSB_OUT_12 ; +wire [6:0] DEM_MSB_OUT_13 ; +wire [6:0] DEM_MSB_OUT_14 ; +wire [6:0] DEM_MSB_OUT_15 ; +wire [6:0] DEM_MSB_OUT_16 ; +wire [6:0] DEM_MSB_OUT_17 ; +wire [6:0] DEM_MSB_OUT_18 ; +wire [6:0] DEM_MSB_OUT_19 ; +wire [6:0] DEM_MSB_OUT_20 ; +wire [6:0] DEM_MSB_OUT_21 ; +wire [6:0] DEM_MSB_OUT_22 ; +wire [6:0] DEM_MSB_OUT_23 ; +wire [6:0] DEM_MSB_OUT_24 ; +wire [6:0] DEM_MSB_OUT_25 ; +wire [6:0] DEM_MSB_OUT_26 ; +wire [6:0] DEM_MSB_OUT_27 ; +wire [6:0] DEM_MSB_OUT_28 ; +wire [6:0] DEM_MSB_OUT_29 ; +wire [6:0] DEM_MSB_OUT_30 ; +wire [6:0] DEM_MSB_OUT_31 ; +wire [6:0] DEM_MSB_OUT_32 ; +wire [6:0] DEM_MSB_OUT_33 ; +wire [6:0] DEM_MSB_OUT_34 ; +wire [6:0] DEM_MSB_OUT_35 ; +wire [6:0] DEM_MSB_OUT_36 ; +wire [6:0] DEM_MSB_OUT_37 ; +wire [6:0] DEM_MSB_OUT_38 ; +wire [6:0] DEM_MSB_OUT_39 ; +wire [6:0] DEM_MSB_OUT_40 ; +wire [6:0] DEM_MSB_OUT_41 ; +wire [6:0] DEM_MSB_OUT_42 ; +wire [6:0] DEM_MSB_OUT_43 ; +wire [6:0] DEM_MSB_OUT_44 ; +wire [6:0] DEM_MSB_OUT_45 ; +wire [6:0] DEM_MSB_OUT_46 ; +wire [6:0] DEM_MSB_OUT_47 ; +wire [6:0] DEM_MSB_OUT_48 ; +wire [6:0] DEM_MSB_OUT_49 ; +wire [6:0] DEM_MSB_OUT_50 ; +wire [6:0] DEM_MSB_OUT_51 ; +wire [6:0] DEM_MSB_OUT_52 ; +wire [6:0] DEM_MSB_OUT_53 ; +wire [6:0] DEM_MSB_OUT_54 ; +wire [6:0] DEM_MSB_OUT_55 ; +wire [6:0] DEM_MSB_OUT_56 ; +wire [6:0] DEM_MSB_OUT_57 ; +wire [6:0] DEM_MSB_OUT_58 ; +wire [6:0] DEM_MSB_OUT_59 ; +wire [6:0] DEM_MSB_OUT_60 ; +wire [6:0] DEM_MSB_OUT_61 ; +wire [6:0] DEM_MSB_OUT_62 ; +wire [6:0] DEM_MSB_OUT_63 ; + + +wire [4:0] DEM_LSB_OUT_0 ; +wire [4:0] DEM_LSB_OUT_1 ; +wire [4:0] DEM_LSB_OUT_2 ; +wire [4:0] DEM_LSB_OUT_3 ; +wire [4:0] DEM_LSB_OUT_4 ; +wire [4:0] DEM_LSB_OUT_5 ; +wire [4:0] DEM_LSB_OUT_6 ; +wire [4:0] DEM_LSB_OUT_7 ; +wire [4:0] DEM_LSB_OUT_8 ; +wire [4:0] DEM_LSB_OUT_9 ; +wire [4:0] DEM_LSB_OUT_10 ; +wire [4:0] DEM_LSB_OUT_11 ; +wire [4:0] DEM_LSB_OUT_12 ; +wire [4:0] DEM_LSB_OUT_13 ; +wire [4:0] DEM_LSB_OUT_14 ; +wire [4:0] DEM_LSB_OUT_15 ; +wire [4:0] DEM_LSB_OUT_16 ; +wire [4:0] DEM_LSB_OUT_17 ; +wire [4:0] DEM_LSB_OUT_18 ; +wire [4:0] DEM_LSB_OUT_19 ; +wire [4:0] DEM_LSB_OUT_20 ; +wire [4:0] DEM_LSB_OUT_21 ; +wire [4:0] DEM_LSB_OUT_22 ; +wire [4:0] DEM_LSB_OUT_23 ; +wire [4:0] DEM_LSB_OUT_24 ; +wire [4:0] DEM_LSB_OUT_25 ; +wire [4:0] DEM_LSB_OUT_26 ; +wire [4:0] DEM_LSB_OUT_27 ; +wire [4:0] DEM_LSB_OUT_28 ; +wire [4:0] DEM_LSB_OUT_29 ; +wire [4:0] DEM_LSB_OUT_30 ; +wire [4:0] DEM_LSB_OUT_31 ; +wire [4:0] DEM_LSB_OUT_32 ; +wire [4:0] DEM_LSB_OUT_33 ; +wire [4:0] DEM_LSB_OUT_34 ; +wire [4:0] DEM_LSB_OUT_35 ; +wire [4:0] DEM_LSB_OUT_36 ; +wire [4:0] DEM_LSB_OUT_37 ; +wire [4:0] DEM_LSB_OUT_38 ; +wire [4:0] DEM_LSB_OUT_39 ; +wire [4:0] DEM_LSB_OUT_40 ; +wire [4:0] DEM_LSB_OUT_41 ; +wire [4:0] DEM_LSB_OUT_42 ; +wire [4:0] DEM_LSB_OUT_43 ; +wire [4:0] DEM_LSB_OUT_44 ; +wire [4:0] DEM_LSB_OUT_45 ; +wire [4:0] DEM_LSB_OUT_46 ; +wire [4:0] DEM_LSB_OUT_47 ; +wire [4:0] DEM_LSB_OUT_48 ; +wire [4:0] DEM_LSB_OUT_49 ; +wire [4:0] DEM_LSB_OUT_50 ; +wire [4:0] DEM_LSB_OUT_51 ; +wire [4:0] DEM_LSB_OUT_52 ; +wire [4:0] DEM_LSB_OUT_53 ; +wire [4:0] DEM_LSB_OUT_54 ; +wire [4:0] DEM_LSB_OUT_55 ; +wire [4:0] DEM_LSB_OUT_56 ; +wire [4:0] DEM_LSB_OUT_57 ; +wire [4:0] DEM_LSB_OUT_58 ; +wire [4:0] DEM_LSB_OUT_59 ; +wire [4:0] DEM_LSB_OUT_60 ; +wire [4:0] DEM_LSB_OUT_61 ; +wire [4:0] DEM_LSB_OUT_62 ; +wire [4:0] DEM_LSB_OUT_63 ; + + + +wire DEM_MSB_DUM_0 ; +wire DEM_MSB_DUM_1 ; +wire DEM_MSB_DUM_2 ; +wire DEM_MSB_DUM_3 ; +wire DEM_MSB_DUM_4 ; +wire DEM_MSB_DUM_5 ; +wire DEM_MSB_DUM_6 ; +wire DEM_MSB_DUM_7 ; +wire DEM_MSB_DUM_8 ; +wire DEM_MSB_DUM_9 ; +wire DEM_MSB_DUM_10; +wire DEM_MSB_DUM_11; +wire DEM_MSB_DUM_12; +wire DEM_MSB_DUM_13; +wire DEM_MSB_DUM_14; +wire DEM_MSB_DUM_15; +wire DEM_MSB_DUM_16; +wire DEM_MSB_DUM_17; +wire DEM_MSB_DUM_18; +wire DEM_MSB_DUM_19; +wire DEM_MSB_DUM_20; +wire DEM_MSB_DUM_21; +wire DEM_MSB_DUM_22; +wire DEM_MSB_DUM_23; +wire DEM_MSB_DUM_24; +wire DEM_MSB_DUM_25; +wire DEM_MSB_DUM_26; +wire DEM_MSB_DUM_27; +wire DEM_MSB_DUM_28; +wire DEM_MSB_DUM_29; +wire DEM_MSB_DUM_30; +wire DEM_MSB_DUM_31; +wire DEM_MSB_DUM_32; +wire DEM_MSB_DUM_33; +wire DEM_MSB_DUM_34; +wire DEM_MSB_DUM_35; +wire DEM_MSB_DUM_36; +wire DEM_MSB_DUM_37; +wire DEM_MSB_DUM_38; +wire DEM_MSB_DUM_39; +wire DEM_MSB_DUM_40; +wire DEM_MSB_DUM_41; +wire DEM_MSB_DUM_42; +wire DEM_MSB_DUM_43; +wire DEM_MSB_DUM_44; +wire DEM_MSB_DUM_45; +wire DEM_MSB_DUM_46; +wire DEM_MSB_DUM_47; +wire DEM_MSB_DUM_48; +wire DEM_MSB_DUM_49; +wire DEM_MSB_DUM_50; +wire DEM_MSB_DUM_51; +wire DEM_MSB_DUM_52; +wire DEM_MSB_DUM_53; +wire DEM_MSB_DUM_54; +wire DEM_MSB_DUM_55; +wire DEM_MSB_DUM_56; +wire DEM_MSB_DUM_57; +wire DEM_MSB_DUM_58; +wire DEM_MSB_DUM_59; +wire DEM_MSB_DUM_60; +wire DEM_MSB_DUM_61; +wire DEM_MSB_DUM_62; +wire DEM_MSB_DUM_63; + + +DA4008_DEM_Parallel_PRBS_64CH inst_dem_64ch ( + .clk (clk ) + ,.prbs_en (prbs_en ) + ,.RST_N (RST_N ) + + ,.dem_set_0 (dem_set[0 ] ) + ,.dem_set_1 (dem_set[1 ] ) + ,.dem_set_2 (dem_set[2 ] ) + ,.dem_set_3 (dem_set[3 ] ) + ,.dem_set_4 (dem_set[4 ] ) + ,.dem_set_5 (dem_set[5 ] ) + ,.dem_set_6 (dem_set[6 ] ) + ,.dem_set_7 (dem_set[7 ] ) + ,.dem_set_8 (dem_set[8 ] ) + ,.dem_set_9 (dem_set[9 ] ) + ,.dem_set_10 (dem_set[10] ) + ,.dem_set_11 (dem_set[11] ) + ,.dem_set_12 (dem_set[12] ) + ,.dem_set_13 (dem_set[13] ) + ,.dem_set_14 (dem_set[14] ) + ,.dem_set_15 (dem_set[15] ) + ,.dem_set_16 (dem_set[16] ) + ,.dem_set_17 (dem_set[17] ) + ,.dem_set_18 (dem_set[18] ) + ,.dem_set_19 (dem_set[19] ) + ,.dem_set_20 (dem_set[20] ) + ,.dem_set_21 (dem_set[21] ) + ,.dem_set_22 (dem_set[22] ) + ,.dem_set_23 (dem_set[23] ) + ,.dem_set_24 (dem_set[24] ) + ,.dem_set_25 (dem_set[25] ) + ,.dem_set_26 (dem_set[26] ) + ,.dem_set_27 (dem_set[27] ) + ,.dem_set_28 (dem_set[28] ) + ,.dem_set_29 (dem_set[29] ) + ,.dem_set_30 (dem_set[30] ) + ,.dem_set_31 (dem_set[31] ) + ,.dem_set_32 (dem_set[32] ) + ,.dem_set_33 (dem_set[33] ) + ,.dem_set_34 (dem_set[34] ) + ,.dem_set_35 (dem_set[35] ) + ,.dem_set_36 (dem_set[36] ) + ,.dem_set_37 (dem_set[37] ) + ,.dem_set_38 (dem_set[38] ) + ,.dem_set_39 (dem_set[39] ) + ,.dem_set_40 (dem_set[40] ) + ,.dem_set_41 (dem_set[41] ) + ,.dem_set_42 (dem_set[42] ) + ,.dem_set_43 (dem_set[43] ) + ,.dem_set_44 (dem_set[44] ) + ,.dem_set_45 (dem_set[45] ) + ,.dem_set_46 (dem_set[46] ) + ,.dem_set_47 (dem_set[47] ) + ,.dem_set_48 (dem_set[48] ) + ,.dem_set_49 (dem_set[49] ) + ,.dem_set_50 (dem_set[50] ) + ,.dem_set_51 (dem_set[51] ) + ,.dem_set_52 (dem_set[52] ) + ,.dem_set_53 (dem_set[53] ) + ,.dem_set_54 (dem_set[54] ) + ,.dem_set_55 (dem_set[55] ) + ,.dem_set_56 (dem_set[56] ) + ,.dem_set_57 (dem_set[57] ) + ,.dem_set_58 (dem_set[58] ) + ,.dem_set_59 (dem_set[59] ) + ,.dem_set_60 (dem_set[60] ) + ,.dem_set_61 (dem_set[61] ) + ,.dem_set_62 (dem_set[62] ) + ,.dem_set_63 (dem_set[63] ) + + ,.data_in_0 (data_in[0 ] ) + ,.data_in_1 (data_in[1 ] ) + ,.data_in_2 (data_in[2 ] ) + ,.data_in_3 (data_in[3 ] ) + ,.data_in_4 (data_in[4 ] ) + ,.data_in_5 (data_in[5 ] ) + ,.data_in_6 (data_in[6 ] ) + ,.data_in_7 (data_in[7 ] ) + ,.data_in_8 (data_in[8 ] ) + ,.data_in_9 (data_in[9 ] ) + ,.data_in_10 (data_in[10] ) + ,.data_in_11 (data_in[11] ) + ,.data_in_12 (data_in[12] ) + ,.data_in_13 (data_in[13] ) + ,.data_in_14 (data_in[14] ) + ,.data_in_15 (data_in[15] ) + ,.data_in_16 (data_in[16] ) + ,.data_in_17 (data_in[17] ) + ,.data_in_18 (data_in[18] ) + ,.data_in_19 (data_in[19] ) + ,.data_in_20 (data_in[20] ) + ,.data_in_21 (data_in[21] ) + ,.data_in_22 (data_in[22] ) + ,.data_in_23 (data_in[23] ) + ,.data_in_24 (data_in[24] ) + ,.data_in_25 (data_in[25] ) + ,.data_in_26 (data_in[26] ) + ,.data_in_27 (data_in[27] ) + ,.data_in_28 (data_in[28] ) + ,.data_in_29 (data_in[29] ) + ,.data_in_30 (data_in[30] ) + ,.data_in_31 (data_in[31] ) + ,.data_in_32 (data_in[32] ) + ,.data_in_33 (data_in[33] ) + ,.data_in_34 (data_in[34] ) + ,.data_in_35 (data_in[35] ) + ,.data_in_36 (data_in[36] ) + ,.data_in_37 (data_in[37] ) + ,.data_in_38 (data_in[38] ) + ,.data_in_39 (data_in[39] ) + ,.data_in_40 (data_in[40] ) + ,.data_in_41 (data_in[41] ) + ,.data_in_42 (data_in[42] ) + ,.data_in_43 (data_in[43] ) + ,.data_in_44 (data_in[44] ) + ,.data_in_45 (data_in[45] ) + ,.data_in_46 (data_in[46] ) + ,.data_in_47 (data_in[47] ) + ,.data_in_48 (data_in[48] ) + ,.data_in_49 (data_in[49] ) + ,.data_in_50 (data_in[50] ) + ,.data_in_51 (data_in[51] ) + ,.data_in_52 (data_in[52] ) + ,.data_in_53 (data_in[53] ) + ,.data_in_54 (data_in[54] ) + ,.data_in_55 (data_in[55] ) + ,.data_in_56 (data_in[56] ) + ,.data_in_57 (data_in[57] ) + ,.data_in_58 (data_in[58] ) + ,.data_in_59 (data_in[59] ) + ,.data_in_60 (data_in[60] ) + ,.data_in_61 (data_in[61] ) + ,.data_in_62 (data_in[62] ) + ,.data_in_63 (data_in[63] ) + + + ,.DEM_MSB_OUT_0 (DEM_MSB_OUT_0 ) + ,.DEM_MSB_OUT_1 (DEM_MSB_OUT_1 ) + ,.DEM_MSB_OUT_2 (DEM_MSB_OUT_2 ) + ,.DEM_MSB_OUT_3 (DEM_MSB_OUT_3 ) + ,.DEM_MSB_OUT_4 (DEM_MSB_OUT_4 ) + ,.DEM_MSB_OUT_5 (DEM_MSB_OUT_5 ) + ,.DEM_MSB_OUT_6 (DEM_MSB_OUT_6 ) + ,.DEM_MSB_OUT_7 (DEM_MSB_OUT_7 ) + ,.DEM_MSB_OUT_8 (DEM_MSB_OUT_8 ) + ,.DEM_MSB_OUT_9 (DEM_MSB_OUT_9 ) + ,.DEM_MSB_OUT_10 (DEM_MSB_OUT_10 ) + ,.DEM_MSB_OUT_11 (DEM_MSB_OUT_11 ) + ,.DEM_MSB_OUT_12 (DEM_MSB_OUT_12 ) + ,.DEM_MSB_OUT_13 (DEM_MSB_OUT_13 ) + ,.DEM_MSB_OUT_14 (DEM_MSB_OUT_14 ) + ,.DEM_MSB_OUT_15 (DEM_MSB_OUT_15 ) + ,.DEM_MSB_OUT_16 (DEM_MSB_OUT_16 ) + ,.DEM_MSB_OUT_17 (DEM_MSB_OUT_17 ) + ,.DEM_MSB_OUT_18 (DEM_MSB_OUT_18 ) + ,.DEM_MSB_OUT_19 (DEM_MSB_OUT_19 ) + ,.DEM_MSB_OUT_20 (DEM_MSB_OUT_20 ) + ,.DEM_MSB_OUT_21 (DEM_MSB_OUT_21 ) + ,.DEM_MSB_OUT_22 (DEM_MSB_OUT_22 ) + ,.DEM_MSB_OUT_23 (DEM_MSB_OUT_23 ) + ,.DEM_MSB_OUT_24 (DEM_MSB_OUT_24 ) + ,.DEM_MSB_OUT_25 (DEM_MSB_OUT_25 ) + ,.DEM_MSB_OUT_26 (DEM_MSB_OUT_26 ) + ,.DEM_MSB_OUT_27 (DEM_MSB_OUT_27 ) + ,.DEM_MSB_OUT_28 (DEM_MSB_OUT_28 ) + ,.DEM_MSB_OUT_29 (DEM_MSB_OUT_29 ) + ,.DEM_MSB_OUT_30 (DEM_MSB_OUT_30 ) + ,.DEM_MSB_OUT_31 (DEM_MSB_OUT_31 ) + ,.DEM_MSB_OUT_32 (DEM_MSB_OUT_32 ) + ,.DEM_MSB_OUT_33 (DEM_MSB_OUT_33 ) + ,.DEM_MSB_OUT_34 (DEM_MSB_OUT_34 ) + ,.DEM_MSB_OUT_35 (DEM_MSB_OUT_35 ) + ,.DEM_MSB_OUT_36 (DEM_MSB_OUT_36 ) + ,.DEM_MSB_OUT_37 (DEM_MSB_OUT_37 ) + ,.DEM_MSB_OUT_38 (DEM_MSB_OUT_38 ) + ,.DEM_MSB_OUT_39 (DEM_MSB_OUT_39 ) + ,.DEM_MSB_OUT_40 (DEM_MSB_OUT_40 ) + ,.DEM_MSB_OUT_41 (DEM_MSB_OUT_41 ) + ,.DEM_MSB_OUT_42 (DEM_MSB_OUT_42 ) + ,.DEM_MSB_OUT_43 (DEM_MSB_OUT_43 ) + ,.DEM_MSB_OUT_44 (DEM_MSB_OUT_44 ) + ,.DEM_MSB_OUT_45 (DEM_MSB_OUT_45 ) + ,.DEM_MSB_OUT_46 (DEM_MSB_OUT_46 ) + ,.DEM_MSB_OUT_47 (DEM_MSB_OUT_47 ) + ,.DEM_MSB_OUT_48 (DEM_MSB_OUT_48 ) + ,.DEM_MSB_OUT_49 (DEM_MSB_OUT_49 ) + ,.DEM_MSB_OUT_50 (DEM_MSB_OUT_50 ) + ,.DEM_MSB_OUT_51 (DEM_MSB_OUT_51 ) + ,.DEM_MSB_OUT_52 (DEM_MSB_OUT_52 ) + ,.DEM_MSB_OUT_53 (DEM_MSB_OUT_53 ) + ,.DEM_MSB_OUT_54 (DEM_MSB_OUT_54 ) + ,.DEM_MSB_OUT_55 (DEM_MSB_OUT_55 ) + ,.DEM_MSB_OUT_56 (DEM_MSB_OUT_56 ) + ,.DEM_MSB_OUT_57 (DEM_MSB_OUT_57 ) + ,.DEM_MSB_OUT_58 (DEM_MSB_OUT_58 ) + ,.DEM_MSB_OUT_59 (DEM_MSB_OUT_59 ) + ,.DEM_MSB_OUT_60 (DEM_MSB_OUT_60 ) + ,.DEM_MSB_OUT_61 (DEM_MSB_OUT_61 ) + ,.DEM_MSB_OUT_62 (DEM_MSB_OUT_62 ) + ,.DEM_MSB_OUT_63 (DEM_MSB_OUT_63 ) + + ,.DEM_LSB_OUT_0 (DEM_LSB_OUT_0 ) + ,.DEM_LSB_OUT_1 (DEM_LSB_OUT_1 ) + ,.DEM_LSB_OUT_2 (DEM_LSB_OUT_2 ) + ,.DEM_LSB_OUT_3 (DEM_LSB_OUT_3 ) + ,.DEM_LSB_OUT_4 (DEM_LSB_OUT_4 ) + ,.DEM_LSB_OUT_5 (DEM_LSB_OUT_5 ) + ,.DEM_LSB_OUT_6 (DEM_LSB_OUT_6 ) + ,.DEM_LSB_OUT_7 (DEM_LSB_OUT_7 ) + ,.DEM_LSB_OUT_8 (DEM_LSB_OUT_8 ) + ,.DEM_LSB_OUT_9 (DEM_LSB_OUT_9 ) + ,.DEM_LSB_OUT_10 (DEM_LSB_OUT_10 ) + ,.DEM_LSB_OUT_11 (DEM_LSB_OUT_11 ) + ,.DEM_LSB_OUT_12 (DEM_LSB_OUT_12 ) + ,.DEM_LSB_OUT_13 (DEM_LSB_OUT_13 ) + ,.DEM_LSB_OUT_14 (DEM_LSB_OUT_14 ) + ,.DEM_LSB_OUT_15 (DEM_LSB_OUT_15 ) + ,.DEM_LSB_OUT_16 (DEM_LSB_OUT_16 ) + ,.DEM_LSB_OUT_17 (DEM_LSB_OUT_17 ) + ,.DEM_LSB_OUT_18 (DEM_LSB_OUT_18 ) + ,.DEM_LSB_OUT_19 (DEM_LSB_OUT_19 ) + ,.DEM_LSB_OUT_20 (DEM_LSB_OUT_20 ) + ,.DEM_LSB_OUT_21 (DEM_LSB_OUT_21 ) + ,.DEM_LSB_OUT_22 (DEM_LSB_OUT_22 ) + ,.DEM_LSB_OUT_23 (DEM_LSB_OUT_23 ) + ,.DEM_LSB_OUT_24 (DEM_LSB_OUT_24 ) + ,.DEM_LSB_OUT_25 (DEM_LSB_OUT_25 ) + ,.DEM_LSB_OUT_26 (DEM_LSB_OUT_26 ) + ,.DEM_LSB_OUT_27 (DEM_LSB_OUT_27 ) + ,.DEM_LSB_OUT_28 (DEM_LSB_OUT_28 ) + ,.DEM_LSB_OUT_29 (DEM_LSB_OUT_29 ) + ,.DEM_LSB_OUT_30 (DEM_LSB_OUT_30 ) + ,.DEM_LSB_OUT_31 (DEM_LSB_OUT_31 ) + ,.DEM_LSB_OUT_32 (DEM_LSB_OUT_32 ) + ,.DEM_LSB_OUT_33 (DEM_LSB_OUT_33 ) + ,.DEM_LSB_OUT_34 (DEM_LSB_OUT_34 ) + ,.DEM_LSB_OUT_35 (DEM_LSB_OUT_35 ) + ,.DEM_LSB_OUT_36 (DEM_LSB_OUT_36 ) + ,.DEM_LSB_OUT_37 (DEM_LSB_OUT_37 ) + ,.DEM_LSB_OUT_38 (DEM_LSB_OUT_38 ) + ,.DEM_LSB_OUT_39 (DEM_LSB_OUT_39 ) + ,.DEM_LSB_OUT_40 (DEM_LSB_OUT_40 ) + ,.DEM_LSB_OUT_41 (DEM_LSB_OUT_41 ) + ,.DEM_LSB_OUT_42 (DEM_LSB_OUT_42 ) + ,.DEM_LSB_OUT_43 (DEM_LSB_OUT_43 ) + ,.DEM_LSB_OUT_44 (DEM_LSB_OUT_44 ) + ,.DEM_LSB_OUT_45 (DEM_LSB_OUT_45 ) + ,.DEM_LSB_OUT_46 (DEM_LSB_OUT_46 ) + ,.DEM_LSB_OUT_47 (DEM_LSB_OUT_47 ) + ,.DEM_LSB_OUT_48 (DEM_LSB_OUT_48 ) + ,.DEM_LSB_OUT_49 (DEM_LSB_OUT_49 ) + ,.DEM_LSB_OUT_50 (DEM_LSB_OUT_50 ) + ,.DEM_LSB_OUT_51 (DEM_LSB_OUT_51 ) + ,.DEM_LSB_OUT_52 (DEM_LSB_OUT_52 ) + ,.DEM_LSB_OUT_53 (DEM_LSB_OUT_53 ) + ,.DEM_LSB_OUT_54 (DEM_LSB_OUT_54 ) + ,.DEM_LSB_OUT_55 (DEM_LSB_OUT_55 ) + ,.DEM_LSB_OUT_56 (DEM_LSB_OUT_56 ) + ,.DEM_LSB_OUT_57 (DEM_LSB_OUT_57 ) + ,.DEM_LSB_OUT_58 (DEM_LSB_OUT_58 ) + ,.DEM_LSB_OUT_59 (DEM_LSB_OUT_59 ) + ,.DEM_LSB_OUT_60 (DEM_LSB_OUT_60 ) + ,.DEM_LSB_OUT_61 (DEM_LSB_OUT_61 ) + ,.DEM_LSB_OUT_62 (DEM_LSB_OUT_62 ) + ,.DEM_LSB_OUT_63 (DEM_LSB_OUT_63 ) + + + ,.DEM_MSB_DUM_0 (DEM_MSB_DUM_0 ) + ,.DEM_MSB_DUM_1 (DEM_MSB_DUM_1 ) + ,.DEM_MSB_DUM_2 (DEM_MSB_DUM_2 ) + ,.DEM_MSB_DUM_3 (DEM_MSB_DUM_3 ) + ,.DEM_MSB_DUM_4 (DEM_MSB_DUM_4 ) + ,.DEM_MSB_DUM_5 (DEM_MSB_DUM_5 ) + ,.DEM_MSB_DUM_6 (DEM_MSB_DUM_6 ) + ,.DEM_MSB_DUM_7 (DEM_MSB_DUM_7 ) + ,.DEM_MSB_DUM_8 (DEM_MSB_DUM_8 ) + ,.DEM_MSB_DUM_9 (DEM_MSB_DUM_9 ) + ,.DEM_MSB_DUM_10 (DEM_MSB_DUM_10 ) + ,.DEM_MSB_DUM_11 (DEM_MSB_DUM_11 ) + ,.DEM_MSB_DUM_12 (DEM_MSB_DUM_12 ) + ,.DEM_MSB_DUM_13 (DEM_MSB_DUM_13 ) + ,.DEM_MSB_DUM_14 (DEM_MSB_DUM_14 ) + ,.DEM_MSB_DUM_15 (DEM_MSB_DUM_15 ) + ,.DEM_MSB_DUM_16 (DEM_MSB_DUM_16 ) + ,.DEM_MSB_DUM_17 (DEM_MSB_DUM_17 ) + ,.DEM_MSB_DUM_18 (DEM_MSB_DUM_18 ) + ,.DEM_MSB_DUM_19 (DEM_MSB_DUM_19 ) + ,.DEM_MSB_DUM_20 (DEM_MSB_DUM_20 ) + ,.DEM_MSB_DUM_21 (DEM_MSB_DUM_21 ) + ,.DEM_MSB_DUM_22 (DEM_MSB_DUM_22 ) + ,.DEM_MSB_DUM_23 (DEM_MSB_DUM_23 ) + ,.DEM_MSB_DUM_24 (DEM_MSB_DUM_24 ) + ,.DEM_MSB_DUM_25 (DEM_MSB_DUM_25 ) + ,.DEM_MSB_DUM_26 (DEM_MSB_DUM_26 ) + ,.DEM_MSB_DUM_27 (DEM_MSB_DUM_27 ) + ,.DEM_MSB_DUM_28 (DEM_MSB_DUM_28 ) + ,.DEM_MSB_DUM_29 (DEM_MSB_DUM_29 ) + ,.DEM_MSB_DUM_30 (DEM_MSB_DUM_30 ) + ,.DEM_MSB_DUM_31 (DEM_MSB_DUM_31 ) + ,.DEM_MSB_DUM_32 (DEM_MSB_DUM_32 ) + ,.DEM_MSB_DUM_33 (DEM_MSB_DUM_33 ) + ,.DEM_MSB_DUM_34 (DEM_MSB_DUM_34 ) + ,.DEM_MSB_DUM_35 (DEM_MSB_DUM_35 ) + ,.DEM_MSB_DUM_36 (DEM_MSB_DUM_36 ) + ,.DEM_MSB_DUM_37 (DEM_MSB_DUM_37 ) + ,.DEM_MSB_DUM_38 (DEM_MSB_DUM_38 ) + ,.DEM_MSB_DUM_39 (DEM_MSB_DUM_39 ) + ,.DEM_MSB_DUM_40 (DEM_MSB_DUM_40 ) + ,.DEM_MSB_DUM_41 (DEM_MSB_DUM_41 ) + ,.DEM_MSB_DUM_42 (DEM_MSB_DUM_42 ) + ,.DEM_MSB_DUM_43 (DEM_MSB_DUM_43 ) + ,.DEM_MSB_DUM_44 (DEM_MSB_DUM_44 ) + ,.DEM_MSB_DUM_45 (DEM_MSB_DUM_45 ) + ,.DEM_MSB_DUM_46 (DEM_MSB_DUM_46 ) + ,.DEM_MSB_DUM_47 (DEM_MSB_DUM_47 ) + ,.DEM_MSB_DUM_48 (DEM_MSB_DUM_48 ) + ,.DEM_MSB_DUM_49 (DEM_MSB_DUM_49 ) + ,.DEM_MSB_DUM_50 (DEM_MSB_DUM_50 ) + ,.DEM_MSB_DUM_51 (DEM_MSB_DUM_51 ) + ,.DEM_MSB_DUM_52 (DEM_MSB_DUM_52 ) + ,.DEM_MSB_DUM_53 (DEM_MSB_DUM_53 ) + ,.DEM_MSB_DUM_54 (DEM_MSB_DUM_54 ) + ,.DEM_MSB_DUM_55 (DEM_MSB_DUM_55 ) + ,.DEM_MSB_DUM_56 (DEM_MSB_DUM_56 ) + ,.DEM_MSB_DUM_57 (DEM_MSB_DUM_57 ) + ,.DEM_MSB_DUM_58 (DEM_MSB_DUM_58 ) + ,.DEM_MSB_DUM_59 (DEM_MSB_DUM_59 ) + ,.DEM_MSB_DUM_60 (DEM_MSB_DUM_60 ) + ,.DEM_MSB_DUM_61 (DEM_MSB_DUM_61 ) + ,.DEM_MSB_DUM_62 (DEM_MSB_DUM_62 ) + ,.DEM_MSB_DUM_63 (DEM_MSB_DUM_63 ) + + + +); + +reg [6:0] r_MSB_OUT_0 ; +reg [6:0] r_MSB_OUT_1 ; +reg [6:0] r_MSB_OUT_2 ; +reg [6:0] r_MSB_OUT_3 ; +reg [6:0] r_MSB_OUT_4 ; +reg [6:0] r_MSB_OUT_5 ; +reg [6:0] r_MSB_OUT_6 ; +reg [6:0] r_MSB_OUT_7 ; +reg [6:0] r_MSB_OUT_8 ; +reg [6:0] r_MSB_OUT_9 ; +reg [6:0] r_MSB_OUT_10 ; +reg [6:0] r_MSB_OUT_11 ; +reg [6:0] r_MSB_OUT_12 ; +reg [6:0] r_MSB_OUT_13 ; +reg [6:0] r_MSB_OUT_14 ; +reg [6:0] r_MSB_OUT_15 ; +reg [6:0] r_MSB_OUT_16 ; +reg [6:0] r_MSB_OUT_17 ; +reg [6:0] r_MSB_OUT_18 ; +reg [6:0] r_MSB_OUT_19 ; +reg [6:0] r_MSB_OUT_20 ; +reg [6:0] r_MSB_OUT_21 ; +reg [6:0] r_MSB_OUT_22 ; +reg [6:0] r_MSB_OUT_23 ; +reg [6:0] r_MSB_OUT_24 ; +reg [6:0] r_MSB_OUT_25 ; +reg [6:0] r_MSB_OUT_26 ; +reg [6:0] r_MSB_OUT_27 ; +reg [6:0] r_MSB_OUT_28 ; +reg [6:0] r_MSB_OUT_29 ; +reg [6:0] r_MSB_OUT_30 ; +reg [6:0] r_MSB_OUT_31 ; +reg [6:0] r_MSB_OUT_32 ; +reg [6:0] r_MSB_OUT_33 ; +reg [6:0] r_MSB_OUT_34 ; +reg [6:0] r_MSB_OUT_35 ; +reg [6:0] r_MSB_OUT_36 ; +reg [6:0] r_MSB_OUT_37 ; +reg [6:0] r_MSB_OUT_38 ; +reg [6:0] r_MSB_OUT_39 ; +reg [6:0] r_MSB_OUT_40 ; +reg [6:0] r_MSB_OUT_41 ; +reg [6:0] r_MSB_OUT_42 ; +reg [6:0] r_MSB_OUT_43 ; +reg [6:0] r_MSB_OUT_44 ; +reg [6:0] r_MSB_OUT_45 ; +reg [6:0] r_MSB_OUT_46 ; +reg [6:0] r_MSB_OUT_47 ; +reg [6:0] r_MSB_OUT_48 ; +reg [6:0] r_MSB_OUT_49 ; +reg [6:0] r_MSB_OUT_50 ; +reg [6:0] r_MSB_OUT_51 ; +reg [6:0] r_MSB_OUT_52 ; +reg [6:0] r_MSB_OUT_53 ; +reg [6:0] r_MSB_OUT_54 ; +reg [6:0] r_MSB_OUT_55 ; +reg [6:0] r_MSB_OUT_56 ; +reg [6:0] r_MSB_OUT_57 ; +reg [6:0] r_MSB_OUT_58 ; +reg [6:0] r_MSB_OUT_59 ; +reg [6:0] r_MSB_OUT_60 ; +reg [6:0] r_MSB_OUT_61 ; +reg [6:0] r_MSB_OUT_62 ; +reg [6:0] r_MSB_OUT_63 ; + + + +reg [4:0] r_LSB_OUT_0 ; +reg [4:0] r_LSB_OUT_1 ; +reg [4:0] r_LSB_OUT_2 ; +reg [4:0] r_LSB_OUT_3 ; +reg [4:0] r_LSB_OUT_4 ; +reg [4:0] r_LSB_OUT_5 ; +reg [4:0] r_LSB_OUT_6 ; +reg [4:0] r_LSB_OUT_7 ; +reg [4:0] r_LSB_OUT_8 ; +reg [4:0] r_LSB_OUT_9 ; +reg [4:0] r_LSB_OUT_10 ; +reg [4:0] r_LSB_OUT_11 ; +reg [4:0] r_LSB_OUT_12 ; +reg [4:0] r_LSB_OUT_13 ; +reg [4:0] r_LSB_OUT_14 ; +reg [4:0] r_LSB_OUT_15 ; +reg [4:0] r_LSB_OUT_16 ; +reg [4:0] r_LSB_OUT_17 ; +reg [4:0] r_LSB_OUT_18 ; +reg [4:0] r_LSB_OUT_19 ; +reg [4:0] r_LSB_OUT_20 ; +reg [4:0] r_LSB_OUT_21 ; +reg [4:0] r_LSB_OUT_22 ; +reg [4:0] r_LSB_OUT_23 ; +reg [4:0] r_LSB_OUT_24 ; +reg [4:0] r_LSB_OUT_25 ; +reg [4:0] r_LSB_OUT_26 ; +reg [4:0] r_LSB_OUT_27 ; +reg [4:0] r_LSB_OUT_28 ; +reg [4:0] r_LSB_OUT_29 ; +reg [4:0] r_LSB_OUT_30 ; +reg [4:0] r_LSB_OUT_31 ; +reg [4:0] r_LSB_OUT_32 ; +reg [4:0] r_LSB_OUT_33 ; +reg [4:0] r_LSB_OUT_34 ; +reg [4:0] r_LSB_OUT_35 ; +reg [4:0] r_LSB_OUT_36 ; +reg [4:0] r_LSB_OUT_37 ; +reg [4:0] r_LSB_OUT_38 ; +reg [4:0] r_LSB_OUT_39 ; +reg [4:0] r_LSB_OUT_40 ; +reg [4:0] r_LSB_OUT_41 ; +reg [4:0] r_LSB_OUT_42 ; +reg [4:0] r_LSB_OUT_43 ; +reg [4:0] r_LSB_OUT_44 ; +reg [4:0] r_LSB_OUT_45 ; +reg [4:0] r_LSB_OUT_46 ; +reg [4:0] r_LSB_OUT_47 ; +reg [4:0] r_LSB_OUT_48 ; +reg [4:0] r_LSB_OUT_49 ; +reg [4:0] r_LSB_OUT_50 ; +reg [4:0] r_LSB_OUT_51 ; +reg [4:0] r_LSB_OUT_52 ; +reg [4:0] r_LSB_OUT_53 ; +reg [4:0] r_LSB_OUT_54 ; +reg [4:0] r_LSB_OUT_55 ; +reg [4:0] r_LSB_OUT_56 ; +reg [4:0] r_LSB_OUT_57 ; +reg [4:0] r_LSB_OUT_58 ; +reg [4:0] r_LSB_OUT_59 ; +reg [4:0] r_LSB_OUT_60 ; +reg [4:0] r_LSB_OUT_61 ; +reg [4:0] r_LSB_OUT_62 ; +reg [4:0] r_LSB_OUT_63 ; + + +reg r_MSB_DUM_0 ; +reg r_MSB_DUM_1 ; +reg r_MSB_DUM_2 ; +reg r_MSB_DUM_3 ; +reg r_MSB_DUM_4 ; +reg r_MSB_DUM_5 ; +reg r_MSB_DUM_6 ; +reg r_MSB_DUM_7 ; +reg r_MSB_DUM_8 ; +reg r_MSB_DUM_9 ; +reg r_MSB_DUM_10; +reg r_MSB_DUM_11; +reg r_MSB_DUM_12; +reg r_MSB_DUM_13; +reg r_MSB_DUM_14; +reg r_MSB_DUM_15; +reg r_MSB_DUM_16; +reg r_MSB_DUM_17; +reg r_MSB_DUM_18; +reg r_MSB_DUM_19; +reg r_MSB_DUM_20; +reg r_MSB_DUM_21; +reg r_MSB_DUM_22; +reg r_MSB_DUM_23; +reg r_MSB_DUM_24; +reg r_MSB_DUM_25; +reg r_MSB_DUM_26; +reg r_MSB_DUM_27; +reg r_MSB_DUM_28; +reg r_MSB_DUM_29; +reg r_MSB_DUM_30; +reg r_MSB_DUM_31; +reg r_MSB_DUM_32; +reg r_MSB_DUM_33; +reg r_MSB_DUM_34; +reg r_MSB_DUM_35; +reg r_MSB_DUM_36; +reg r_MSB_DUM_37; +reg r_MSB_DUM_38; +reg r_MSB_DUM_39; +reg r_MSB_DUM_40; +reg r_MSB_DUM_41; +reg r_MSB_DUM_42; +reg r_MSB_DUM_43; +reg r_MSB_DUM_44; +reg r_MSB_DUM_45; +reg r_MSB_DUM_46; +reg r_MSB_DUM_47; +reg r_MSB_DUM_48; +reg r_MSB_DUM_49; +reg r_MSB_DUM_50; +reg r_MSB_DUM_51; +reg r_MSB_DUM_52; +reg r_MSB_DUM_53; +reg r_MSB_DUM_54; +reg r_MSB_DUM_55; +reg r_MSB_DUM_56; +reg r_MSB_DUM_57; +reg r_MSB_DUM_58; +reg r_MSB_DUM_59; +reg r_MSB_DUM_60; +reg r_MSB_DUM_61; +reg r_MSB_DUM_62; +reg r_MSB_DUM_63; + + +always @(posedge clk or negedge RST_N) begin + if(!RST_N) begin + r_MSB_OUT_0 <= 7'd0; + r_MSB_OUT_1 <= 7'd0; + r_MSB_OUT_2 <= 7'd0; + r_MSB_OUT_3 <= 7'd0; + r_MSB_OUT_4 <= 7'd0; + r_MSB_OUT_5 <= 7'd0; + r_MSB_OUT_6 <= 7'd0; + r_MSB_OUT_7 <= 7'd0; + r_MSB_OUT_8 <= 7'd0; + r_MSB_OUT_9 <= 7'd0; + r_MSB_OUT_10 <= 7'd0; + r_MSB_OUT_11 <= 7'd0; + r_MSB_OUT_12 <= 7'd0; + r_MSB_OUT_13 <= 7'd0; + r_MSB_OUT_14 <= 7'd0; + r_MSB_OUT_15 <= 7'd0; + r_MSB_OUT_16 <= 7'd0; + r_MSB_OUT_17 <= 7'd0; + r_MSB_OUT_18 <= 7'd0; + r_MSB_OUT_19 <= 7'd0; + r_MSB_OUT_20 <= 7'd0; + r_MSB_OUT_21 <= 7'd0; + r_MSB_OUT_22 <= 7'd0; + r_MSB_OUT_23 <= 7'd0; + r_MSB_OUT_24 <= 7'd0; + r_MSB_OUT_25 <= 7'd0; + r_MSB_OUT_26 <= 7'd0; + r_MSB_OUT_27 <= 7'd0; + r_MSB_OUT_28 <= 7'd0; + r_MSB_OUT_29 <= 7'd0; + r_MSB_OUT_30 <= 7'd0; + r_MSB_OUT_31 <= 7'd0; + + r_LSB_OUT_0 <= 5'd0; + r_LSB_OUT_1 <= 5'd0; + r_LSB_OUT_2 <= 5'd0; + r_LSB_OUT_3 <= 5'd0; + r_LSB_OUT_4 <= 5'd0; + r_LSB_OUT_5 <= 5'd0; + r_LSB_OUT_6 <= 5'd0; + r_LSB_OUT_7 <= 5'd0; + r_LSB_OUT_8 <= 5'd0; + r_LSB_OUT_9 <= 5'd0; + r_LSB_OUT_10 <= 5'd0; + r_LSB_OUT_11 <= 5'd0; + r_LSB_OUT_12 <= 5'd0; + r_LSB_OUT_13 <= 5'd0; + r_LSB_OUT_14 <= 5'd0; + r_LSB_OUT_15 <= 5'd0; + r_LSB_OUT_16 <= 5'd0; + r_LSB_OUT_17 <= 5'd0; + r_LSB_OUT_18 <= 5'd0; + r_LSB_OUT_19 <= 5'd0; + r_LSB_OUT_20 <= 5'd0; + r_LSB_OUT_21 <= 5'd0; + r_LSB_OUT_22 <= 5'd0; + r_LSB_OUT_23 <= 5'd0; + r_LSB_OUT_24 <= 5'd0; + r_LSB_OUT_25 <= 5'd0; + r_LSB_OUT_26 <= 5'd0; + r_LSB_OUT_27 <= 5'd0; + r_LSB_OUT_28 <= 5'd0; + r_LSB_OUT_29 <= 5'd0; + r_LSB_OUT_30 <= 5'd0; + r_LSB_OUT_31 <= 5'd0; + + r_MSB_DUM_0 <= 1'd0; + r_MSB_DUM_1 <= 1'd0; + r_MSB_DUM_2 <= 1'd0; + r_MSB_DUM_3 <= 1'd0; + r_MSB_DUM_4 <= 1'd0; + r_MSB_DUM_5 <= 1'd0; + r_MSB_DUM_6 <= 1'd0; + r_MSB_DUM_7 <= 1'd0; + r_MSB_DUM_8 <= 1'd0; + r_MSB_DUM_9 <= 1'd0; + r_MSB_DUM_10 <= 1'd0; + r_MSB_DUM_11 <= 1'd0; + r_MSB_DUM_12 <= 1'd0; + r_MSB_DUM_13 <= 1'd0; + r_MSB_DUM_14 <= 1'd0; + r_MSB_DUM_15 <= 1'd0; + r_MSB_DUM_16 <= 1'd0; + r_MSB_DUM_17 <= 1'd0; + r_MSB_DUM_18 <= 1'd0; + r_MSB_DUM_19 <= 1'd0; + r_MSB_DUM_20 <= 1'd0; + r_MSB_DUM_21 <= 1'd0; + r_MSB_DUM_22 <= 1'd0; + r_MSB_DUM_23 <= 1'd0; + r_MSB_DUM_24 <= 1'd0; + r_MSB_DUM_25 <= 1'd0; + r_MSB_DUM_26 <= 1'd0; + r_MSB_DUM_27 <= 1'd0; + r_MSB_DUM_28 <= 1'd0; + r_MSB_DUM_29 <= 1'd0; + r_MSB_DUM_30 <= 1'd0; + r_MSB_DUM_31 <= 1'd0; + + + end + else begin + r_MSB_OUT_0 <= DEM_MSB_OUT_0; + r_MSB_OUT_1 <= DEM_MSB_OUT_1; + r_MSB_OUT_2 <= DEM_MSB_OUT_2; + r_MSB_OUT_3 <= DEM_MSB_OUT_3; + r_MSB_OUT_4 <= DEM_MSB_OUT_4; + r_MSB_OUT_5 <= DEM_MSB_OUT_5; + r_MSB_OUT_6 <= DEM_MSB_OUT_6; + r_MSB_OUT_7 <= DEM_MSB_OUT_7; + r_MSB_OUT_7 <= DEM_MSB_OUT_7; + r_MSB_OUT_8 <= DEM_MSB_OUT_8; + r_MSB_OUT_9 <= DEM_MSB_OUT_9; + r_MSB_OUT_10 <= DEM_MSB_OUT_10; + r_MSB_OUT_11 <= DEM_MSB_OUT_11; + r_MSB_OUT_12 <= DEM_MSB_OUT_12; + r_MSB_OUT_13 <= DEM_MSB_OUT_13; + r_MSB_OUT_14 <= DEM_MSB_OUT_14; + r_MSB_OUT_15 <= DEM_MSB_OUT_15; + r_MSB_OUT_16 <= DEM_MSB_OUT_16; + r_MSB_OUT_17 <= DEM_MSB_OUT_17; + r_MSB_OUT_18 <= DEM_MSB_OUT_18; + r_MSB_OUT_19 <= DEM_MSB_OUT_19; + r_MSB_OUT_20 <= DEM_MSB_OUT_20; + r_MSB_OUT_21 <= DEM_MSB_OUT_21; + r_MSB_OUT_22 <= DEM_MSB_OUT_22; + r_MSB_OUT_23 <= DEM_MSB_OUT_23; + r_MSB_OUT_24 <= DEM_MSB_OUT_24; + r_MSB_OUT_25 <= DEM_MSB_OUT_25; + r_MSB_OUT_26 <= DEM_MSB_OUT_26; + r_MSB_OUT_27 <= DEM_MSB_OUT_27; + r_MSB_OUT_28 <= DEM_MSB_OUT_28; + r_MSB_OUT_29 <= DEM_MSB_OUT_29; + r_MSB_OUT_30 <= DEM_MSB_OUT_30; + r_MSB_OUT_31 <= DEM_MSB_OUT_31; + + r_LSB_OUT_0 <= DEM_LSB_OUT_0; + r_LSB_OUT_1 <= DEM_LSB_OUT_1; + r_LSB_OUT_2 <= DEM_LSB_OUT_2; + r_LSB_OUT_3 <= DEM_LSB_OUT_3; + r_LSB_OUT_4 <= DEM_LSB_OUT_4; + r_LSB_OUT_5 <= DEM_LSB_OUT_5; + r_LSB_OUT_6 <= DEM_LSB_OUT_6; + r_LSB_OUT_7 <= DEM_LSB_OUT_7; + r_LSB_OUT_8 <= DEM_LSB_OUT_8; + r_LSB_OUT_9 <= DEM_LSB_OUT_9; + r_LSB_OUT_10 <= DEM_LSB_OUT_10; + r_LSB_OUT_11 <= DEM_LSB_OUT_11; + r_LSB_OUT_12 <= DEM_LSB_OUT_12; + r_LSB_OUT_13 <= DEM_LSB_OUT_13; + r_LSB_OUT_14 <= DEM_LSB_OUT_14; + r_LSB_OUT_15 <= DEM_LSB_OUT_15; + r_LSB_OUT_16 <= DEM_LSB_OUT_16; + r_LSB_OUT_17 <= DEM_LSB_OUT_17; + r_LSB_OUT_18 <= DEM_LSB_OUT_18; + r_LSB_OUT_19 <= DEM_LSB_OUT_19; + r_LSB_OUT_20 <= DEM_LSB_OUT_20; + r_LSB_OUT_21 <= DEM_LSB_OUT_21; + r_LSB_OUT_22 <= DEM_LSB_OUT_22; + r_LSB_OUT_23 <= DEM_LSB_OUT_23; + r_LSB_OUT_24 <= DEM_LSB_OUT_24; + r_LSB_OUT_25 <= DEM_LSB_OUT_25; + r_LSB_OUT_26 <= DEM_LSB_OUT_26; + r_LSB_OUT_27 <= DEM_LSB_OUT_27; + r_LSB_OUT_28 <= DEM_LSB_OUT_28; + r_LSB_OUT_29 <= DEM_LSB_OUT_29; + r_LSB_OUT_30 <= DEM_LSB_OUT_30; + r_LSB_OUT_31 <= DEM_LSB_OUT_31; + + r_MSB_DUM_0 <= DEM_MSB_DUM_0; + r_MSB_DUM_1 <= DEM_MSB_DUM_1; + r_MSB_DUM_2 <= DEM_MSB_DUM_2; + r_MSB_DUM_3 <= DEM_MSB_DUM_3; + r_MSB_DUM_4 <= DEM_MSB_DUM_4; + r_MSB_DUM_5 <= DEM_MSB_DUM_5; + r_MSB_DUM_6 <= DEM_MSB_DUM_6; + r_MSB_DUM_7 <= DEM_MSB_DUM_7; + r_MSB_DUM_8 <= DEM_MSB_DUM_8; + r_MSB_DUM_9 <= DEM_MSB_DUM_9; + r_MSB_DUM_10 <= DEM_MSB_DUM_10; + r_MSB_DUM_11 <= DEM_MSB_DUM_11; + r_MSB_DUM_12 <= DEM_MSB_DUM_12; + r_MSB_DUM_13 <= DEM_MSB_DUM_13; + r_MSB_DUM_14 <= DEM_MSB_DUM_14; + r_MSB_DUM_15 <= DEM_MSB_DUM_15; + r_MSB_DUM_16 <= DEM_MSB_DUM_16; + r_MSB_DUM_17 <= DEM_MSB_DUM_17; + r_MSB_DUM_18 <= DEM_MSB_DUM_18; + r_MSB_DUM_19 <= DEM_MSB_DUM_19; + r_MSB_DUM_20 <= DEM_MSB_DUM_20; + r_MSB_DUM_21 <= DEM_MSB_DUM_21; + r_MSB_DUM_22 <= DEM_MSB_DUM_22; + r_MSB_DUM_23 <= DEM_MSB_DUM_23; + r_MSB_DUM_24 <= DEM_MSB_DUM_24; + r_MSB_DUM_25 <= DEM_MSB_DUM_25; + r_MSB_DUM_26 <= DEM_MSB_DUM_26; + r_MSB_DUM_27 <= DEM_MSB_DUM_27; + r_MSB_DUM_28 <= DEM_MSB_DUM_28; + r_MSB_DUM_29 <= DEM_MSB_DUM_29; + r_MSB_DUM_30 <= DEM_MSB_DUM_30; + r_MSB_DUM_31 <= DEM_MSB_DUM_31; + end +end + +always @(negedge clk or negedge RST_N) begin + if(!RST_N) begin + r_MSB_OUT_32 <= 7'd0; + r_MSB_OUT_33 <= 7'd0; + r_MSB_OUT_34 <= 7'd0; + r_MSB_OUT_35 <= 7'd0; + r_MSB_OUT_36 <= 7'd0; + r_MSB_OUT_37 <= 7'd0; + r_MSB_OUT_38 <= 7'd0; + r_MSB_OUT_39 <= 7'd0; + r_MSB_OUT_40 <= 7'd0; + r_MSB_OUT_41 <= 7'd0; + r_MSB_OUT_42 <= 7'd0; + r_MSB_OUT_43 <= 7'd0; + r_MSB_OUT_44 <= 7'd0; + r_MSB_OUT_45 <= 7'd0; + r_MSB_OUT_46 <= 7'd0; + r_MSB_OUT_47 <= 7'd0; + r_MSB_OUT_48 <= 7'd0; + r_MSB_OUT_49 <= 7'd0; + r_MSB_OUT_50 <= 7'd0; + r_MSB_OUT_51 <= 7'd0; + r_MSB_OUT_52 <= 7'd0; + r_MSB_OUT_53 <= 7'd0; + r_MSB_OUT_54 <= 7'd0; + r_MSB_OUT_55 <= 7'd0; + r_MSB_OUT_56 <= 7'd0; + r_MSB_OUT_57 <= 7'd0; + r_MSB_OUT_58 <= 7'd0; + r_MSB_OUT_59 <= 7'd0; + r_MSB_OUT_60 <= 7'd0; + r_MSB_OUT_61 <= 7'd0; + r_MSB_OUT_62 <= 7'd0; + r_MSB_OUT_63 <= 7'd0; + + + r_LSB_OUT_32 <= 5'd0; + r_LSB_OUT_33 <= 5'd0; + r_LSB_OUT_34 <= 5'd0; + r_LSB_OUT_35 <= 5'd0; + r_LSB_OUT_36 <= 5'd0; + r_LSB_OUT_37 <= 5'd0; + r_LSB_OUT_38 <= 5'd0; + r_LSB_OUT_39 <= 5'd0; + r_LSB_OUT_40 <= 5'd0; + r_LSB_OUT_41 <= 5'd0; + r_LSB_OUT_42 <= 5'd0; + r_LSB_OUT_43 <= 5'd0; + r_LSB_OUT_44 <= 5'd0; + r_LSB_OUT_45 <= 5'd0; + r_LSB_OUT_46 <= 5'd0; + r_LSB_OUT_47 <= 5'd0; + r_LSB_OUT_48 <= 5'd0; + r_LSB_OUT_49 <= 5'd0; + r_LSB_OUT_50 <= 5'd0; + r_LSB_OUT_51 <= 5'd0; + r_LSB_OUT_52 <= 5'd0; + r_LSB_OUT_53 <= 5'd0; + r_LSB_OUT_54 <= 5'd0; + r_LSB_OUT_55 <= 5'd0; + r_LSB_OUT_56 <= 5'd0; + r_LSB_OUT_57 <= 5'd0; + r_LSB_OUT_58 <= 5'd0; + r_LSB_OUT_59 <= 5'd0; + r_LSB_OUT_60 <= 5'd0; + r_LSB_OUT_61 <= 5'd0; + r_LSB_OUT_62 <= 5'd0; + r_LSB_OUT_63 <= 5'd0; + + r_MSB_DUM_32 <= 1'd0; + r_MSB_DUM_33 <= 1'd0; + r_MSB_DUM_34 <= 1'd0; + r_MSB_DUM_35 <= 1'd0; + r_MSB_DUM_36 <= 1'd0; + r_MSB_DUM_37 <= 1'd0; + r_MSB_DUM_38 <= 1'd0; + r_MSB_DUM_39 <= 1'd0; + r_MSB_DUM_40 <= 1'd0; + r_MSB_DUM_41 <= 1'd0; + r_MSB_DUM_42 <= 1'd0; + r_MSB_DUM_43 <= 1'd0; + r_MSB_DUM_44 <= 1'd0; + r_MSB_DUM_45 <= 1'd0; + r_MSB_DUM_46 <= 1'd0; + r_MSB_DUM_47 <= 1'd0; + r_MSB_DUM_48 <= 1'd0; + r_MSB_DUM_49 <= 1'd0; + r_MSB_DUM_50 <= 1'd0; + r_MSB_DUM_51 <= 1'd0; + r_MSB_DUM_52 <= 1'd0; + r_MSB_DUM_53 <= 1'd0; + r_MSB_DUM_54 <= 1'd0; + r_MSB_DUM_55 <= 1'd0; + r_MSB_DUM_56 <= 1'd0; + r_MSB_DUM_57 <= 1'd0; + r_MSB_DUM_58 <= 1'd0; + r_MSB_DUM_59 <= 1'd0; + r_MSB_DUM_60 <= 1'd0; + r_MSB_DUM_61 <= 1'd0; + r_MSB_DUM_62 <= 1'd0; + r_MSB_DUM_63 <= 1'd0; + + + + end + else begin + r_MSB_OUT_32 <= DEM_MSB_OUT_32 ; + r_MSB_OUT_33 <= DEM_MSB_OUT_33 ; + r_MSB_OUT_34 <= DEM_MSB_OUT_34 ; + r_MSB_OUT_35 <= DEM_MSB_OUT_35 ; + r_MSB_OUT_36 <= DEM_MSB_OUT_36 ; + r_MSB_OUT_37 <= DEM_MSB_OUT_37 ; + r_MSB_OUT_38 <= DEM_MSB_OUT_38 ; + r_MSB_OUT_39 <= DEM_MSB_OUT_39 ; + r_MSB_OUT_40 <= DEM_MSB_OUT_40 ; + r_MSB_OUT_41 <= DEM_MSB_OUT_41 ; + r_MSB_OUT_42 <= DEM_MSB_OUT_42 ; + r_MSB_OUT_43 <= DEM_MSB_OUT_43 ; + r_MSB_OUT_44 <= DEM_MSB_OUT_44 ; + r_MSB_OUT_45 <= DEM_MSB_OUT_45 ; + r_MSB_OUT_46 <= DEM_MSB_OUT_46 ; + r_MSB_OUT_47 <= DEM_MSB_OUT_47 ; + r_MSB_OUT_48 <= DEM_MSB_OUT_48 ; + r_MSB_OUT_49 <= DEM_MSB_OUT_49 ; + r_MSB_OUT_50 <= DEM_MSB_OUT_50 ; + r_MSB_OUT_51 <= DEM_MSB_OUT_51 ; + r_MSB_OUT_52 <= DEM_MSB_OUT_52 ; + r_MSB_OUT_53 <= DEM_MSB_OUT_53 ; + r_MSB_OUT_54 <= DEM_MSB_OUT_54 ; + r_MSB_OUT_55 <= DEM_MSB_OUT_55 ; + r_MSB_OUT_56 <= DEM_MSB_OUT_56 ; + r_MSB_OUT_57 <= DEM_MSB_OUT_57 ; + r_MSB_OUT_58 <= DEM_MSB_OUT_58 ; + r_MSB_OUT_59 <= DEM_MSB_OUT_59 ; + r_MSB_OUT_60 <= DEM_MSB_OUT_60 ; + r_MSB_OUT_61 <= DEM_MSB_OUT_61 ; + r_MSB_OUT_62 <= DEM_MSB_OUT_62 ; + r_MSB_OUT_63 <= DEM_MSB_OUT_63 ; + + r_LSB_OUT_32 <= DEM_LSB_OUT_32 ; + r_LSB_OUT_33 <= DEM_LSB_OUT_33 ; + r_LSB_OUT_34 <= DEM_LSB_OUT_34 ; + r_LSB_OUT_35 <= DEM_LSB_OUT_35 ; + r_LSB_OUT_36 <= DEM_LSB_OUT_36 ; + r_LSB_OUT_37 <= DEM_LSB_OUT_37 ; + r_LSB_OUT_38 <= DEM_LSB_OUT_38 ; + r_LSB_OUT_39 <= DEM_LSB_OUT_39 ; + r_LSB_OUT_40 <= DEM_LSB_OUT_40 ; + r_LSB_OUT_41 <= DEM_LSB_OUT_41 ; + r_LSB_OUT_42 <= DEM_LSB_OUT_42 ; + r_LSB_OUT_43 <= DEM_LSB_OUT_43 ; + r_LSB_OUT_44 <= DEM_LSB_OUT_44 ; + r_LSB_OUT_45 <= DEM_LSB_OUT_45 ; + r_LSB_OUT_46 <= DEM_LSB_OUT_46 ; + r_LSB_OUT_47 <= DEM_LSB_OUT_47 ; + r_LSB_OUT_48 <= DEM_LSB_OUT_48 ; + r_LSB_OUT_49 <= DEM_LSB_OUT_49 ; + r_LSB_OUT_50 <= DEM_LSB_OUT_50 ; + r_LSB_OUT_51 <= DEM_LSB_OUT_51 ; + r_LSB_OUT_52 <= DEM_LSB_OUT_52 ; + r_LSB_OUT_53 <= DEM_LSB_OUT_53 ; + r_LSB_OUT_54 <= DEM_LSB_OUT_54 ; + r_LSB_OUT_55 <= DEM_LSB_OUT_55 ; + r_LSB_OUT_56 <= DEM_LSB_OUT_56 ; + r_LSB_OUT_57 <= DEM_LSB_OUT_57 ; + r_LSB_OUT_58 <= DEM_LSB_OUT_58 ; + r_LSB_OUT_59 <= DEM_LSB_OUT_59 ; + r_LSB_OUT_60 <= DEM_LSB_OUT_60 ; + r_LSB_OUT_61 <= DEM_LSB_OUT_61 ; + r_LSB_OUT_62 <= DEM_LSB_OUT_62 ; + r_LSB_OUT_63 <= DEM_LSB_OUT_63 ; + + r_MSB_DUM_32 <= DEM_MSB_DUM_32 ; + r_MSB_DUM_33 <= DEM_MSB_DUM_33 ; + r_MSB_DUM_34 <= DEM_MSB_DUM_34 ; + r_MSB_DUM_35 <= DEM_MSB_DUM_35 ; + r_MSB_DUM_36 <= DEM_MSB_DUM_36 ; + r_MSB_DUM_37 <= DEM_MSB_DUM_37 ; + r_MSB_DUM_38 <= DEM_MSB_DUM_38 ; + r_MSB_DUM_39 <= DEM_MSB_DUM_39 ; + r_MSB_DUM_40 <= DEM_MSB_DUM_40 ; + r_MSB_DUM_41 <= DEM_MSB_DUM_41 ; + r_MSB_DUM_42 <= DEM_MSB_DUM_42 ; + r_MSB_DUM_43 <= DEM_MSB_DUM_43 ; + r_MSB_DUM_44 <= DEM_MSB_DUM_44 ; + r_MSB_DUM_45 <= DEM_MSB_DUM_45 ; + r_MSB_DUM_46 <= DEM_MSB_DUM_46 ; + r_MSB_DUM_47 <= DEM_MSB_DUM_47 ; + r_MSB_DUM_48 <= DEM_MSB_DUM_48 ; + r_MSB_DUM_49 <= DEM_MSB_DUM_49 ; + r_MSB_DUM_50 <= DEM_MSB_DUM_50 ; + r_MSB_DUM_51 <= DEM_MSB_DUM_51 ; + r_MSB_DUM_52 <= DEM_MSB_DUM_52 ; + r_MSB_DUM_53 <= DEM_MSB_DUM_53 ; + r_MSB_DUM_54 <= DEM_MSB_DUM_54 ; + r_MSB_DUM_55 <= DEM_MSB_DUM_55 ; + r_MSB_DUM_56 <= DEM_MSB_DUM_56 ; + r_MSB_DUM_57 <= DEM_MSB_DUM_57 ; + r_MSB_DUM_58 <= DEM_MSB_DUM_58 ; + r_MSB_DUM_59 <= DEM_MSB_DUM_59 ; + r_MSB_DUM_60 <= DEM_MSB_DUM_60 ; + r_MSB_DUM_61 <= DEM_MSB_DUM_61 ; + r_MSB_DUM_62 <= DEM_MSB_DUM_62 ; + r_MSB_DUM_63 <= DEM_MSB_DUM_63 ; + + + end +end + +assign MSB_OUT[0 ] = r_MSB_OUT_0 ; +assign MSB_OUT[1 ] = r_MSB_OUT_1 ; +assign MSB_OUT[2 ] = r_MSB_OUT_2 ; +assign MSB_OUT[3 ] = r_MSB_OUT_3 ; +assign MSB_OUT[4 ] = r_MSB_OUT_4 ; +assign MSB_OUT[5 ] = r_MSB_OUT_5 ; +assign MSB_OUT[6 ] = r_MSB_OUT_6 ; +assign MSB_OUT[7 ] = r_MSB_OUT_7 ; +assign MSB_OUT[8 ] = r_MSB_OUT_8 ; +assign MSB_OUT[9 ] = r_MSB_OUT_9 ; +assign MSB_OUT[10] = r_MSB_OUT_10; +assign MSB_OUT[11] = r_MSB_OUT_11; +assign MSB_OUT[12] = r_MSB_OUT_12; +assign MSB_OUT[13] = r_MSB_OUT_13; +assign MSB_OUT[14] = r_MSB_OUT_14; +assign MSB_OUT[15] = r_MSB_OUT_15; +assign MSB_OUT[16] = r_MSB_OUT_16; +assign MSB_OUT[17] = r_MSB_OUT_17; +assign MSB_OUT[18] = r_MSB_OUT_18; +assign MSB_OUT[19] = r_MSB_OUT_19; +assign MSB_OUT[20] = r_MSB_OUT_20; +assign MSB_OUT[21] = r_MSB_OUT_21; +assign MSB_OUT[22] = r_MSB_OUT_22; +assign MSB_OUT[23] = r_MSB_OUT_23; +assign MSB_OUT[24] = r_MSB_OUT_24; +assign MSB_OUT[25] = r_MSB_OUT_25; +assign MSB_OUT[26] = r_MSB_OUT_26; +assign MSB_OUT[27] = r_MSB_OUT_27; +assign MSB_OUT[28] = r_MSB_OUT_28; +assign MSB_OUT[29] = r_MSB_OUT_29; +assign MSB_OUT[30] = r_MSB_OUT_30; +assign MSB_OUT[31] = r_MSB_OUT_31; +assign MSB_OUT[32] = r_MSB_OUT_32; +assign MSB_OUT[33] = r_MSB_OUT_33; +assign MSB_OUT[34] = r_MSB_OUT_34; +assign MSB_OUT[35] = r_MSB_OUT_35; +assign MSB_OUT[36] = r_MSB_OUT_36; +assign MSB_OUT[37] = r_MSB_OUT_37; +assign MSB_OUT[38] = r_MSB_OUT_38; +assign MSB_OUT[39] = r_MSB_OUT_39; +assign MSB_OUT[40] = r_MSB_OUT_40; +assign MSB_OUT[41] = r_MSB_OUT_41; +assign MSB_OUT[42] = r_MSB_OUT_42; +assign MSB_OUT[43] = r_MSB_OUT_43; +assign MSB_OUT[44] = r_MSB_OUT_44; +assign MSB_OUT[45] = r_MSB_OUT_45; +assign MSB_OUT[46] = r_MSB_OUT_46; +assign MSB_OUT[47] = r_MSB_OUT_47; +assign MSB_OUT[48] = r_MSB_OUT_48; +assign MSB_OUT[49] = r_MSB_OUT_49; +assign MSB_OUT[50] = r_MSB_OUT_50; +assign MSB_OUT[51] = r_MSB_OUT_51; +assign MSB_OUT[52] = r_MSB_OUT_52; +assign MSB_OUT[53] = r_MSB_OUT_53; +assign MSB_OUT[54] = r_MSB_OUT_54; +assign MSB_OUT[55] = r_MSB_OUT_55; +assign MSB_OUT[56] = r_MSB_OUT_56; +assign MSB_OUT[57] = r_MSB_OUT_57; +assign MSB_OUT[58] = r_MSB_OUT_58; +assign MSB_OUT[59] = r_MSB_OUT_59; +assign MSB_OUT[60] = r_MSB_OUT_60; +assign MSB_OUT[61] = r_MSB_OUT_61; +assign MSB_OUT[62] = r_MSB_OUT_62; +assign MSB_OUT[63] = r_MSB_OUT_63; + + +assign LSB_OUT[0 ] = r_LSB_OUT_0 ; +assign LSB_OUT[1 ] = r_LSB_OUT_1 ; +assign LSB_OUT[2 ] = r_LSB_OUT_2 ; +assign LSB_OUT[3 ] = r_LSB_OUT_3 ; +assign LSB_OUT[4 ] = r_LSB_OUT_4 ; +assign LSB_OUT[5 ] = r_LSB_OUT_5 ; +assign LSB_OUT[6 ] = r_LSB_OUT_6 ; +assign LSB_OUT[7 ] = r_LSB_OUT_7 ; +assign LSB_OUT[8 ] = r_LSB_OUT_8 ; +assign LSB_OUT[9 ] = r_LSB_OUT_9 ; +assign LSB_OUT[10] = r_LSB_OUT_10; +assign LSB_OUT[11] = r_LSB_OUT_11; +assign LSB_OUT[12] = r_LSB_OUT_12; +assign LSB_OUT[13] = r_LSB_OUT_13; +assign LSB_OUT[14] = r_LSB_OUT_14; +assign LSB_OUT[15] = r_LSB_OUT_15; +assign LSB_OUT[16] = r_LSB_OUT_16; +assign LSB_OUT[17] = r_LSB_OUT_17; +assign LSB_OUT[18] = r_LSB_OUT_18; +assign LSB_OUT[19] = r_LSB_OUT_19; +assign LSB_OUT[20] = r_LSB_OUT_20; +assign LSB_OUT[21] = r_LSB_OUT_21; +assign LSB_OUT[22] = r_LSB_OUT_22; +assign LSB_OUT[23] = r_LSB_OUT_23; +assign LSB_OUT[24] = r_LSB_OUT_24; +assign LSB_OUT[25] = r_LSB_OUT_25; +assign LSB_OUT[26] = r_LSB_OUT_26; +assign LSB_OUT[27] = r_LSB_OUT_27; +assign LSB_OUT[28] = r_LSB_OUT_28; +assign LSB_OUT[29] = r_LSB_OUT_29; +assign LSB_OUT[30] = r_LSB_OUT_30; +assign LSB_OUT[31] = r_LSB_OUT_31; +assign LSB_OUT[32] = r_LSB_OUT_32; +assign LSB_OUT[33] = r_LSB_OUT_33; +assign LSB_OUT[34] = r_LSB_OUT_34; +assign LSB_OUT[35] = r_LSB_OUT_35; +assign LSB_OUT[36] = r_LSB_OUT_36; +assign LSB_OUT[37] = r_LSB_OUT_37; +assign LSB_OUT[38] = r_LSB_OUT_38; +assign LSB_OUT[39] = r_LSB_OUT_39; +assign LSB_OUT[40] = r_LSB_OUT_40; +assign LSB_OUT[41] = r_LSB_OUT_41; +assign LSB_OUT[42] = r_LSB_OUT_42; +assign LSB_OUT[43] = r_LSB_OUT_43; +assign LSB_OUT[44] = r_LSB_OUT_44; +assign LSB_OUT[45] = r_LSB_OUT_45; +assign LSB_OUT[46] = r_LSB_OUT_46; +assign LSB_OUT[47] = r_LSB_OUT_47; +assign LSB_OUT[48] = r_LSB_OUT_48; +assign LSB_OUT[49] = r_LSB_OUT_49; +assign LSB_OUT[50] = r_LSB_OUT_50; +assign LSB_OUT[51] = r_LSB_OUT_51; +assign LSB_OUT[52] = r_LSB_OUT_52; +assign LSB_OUT[53] = r_LSB_OUT_53; +assign LSB_OUT[54] = r_LSB_OUT_54; +assign LSB_OUT[55] = r_LSB_OUT_55; +assign LSB_OUT[56] = r_LSB_OUT_56; +assign LSB_OUT[57] = r_LSB_OUT_57; +assign LSB_OUT[58] = r_LSB_OUT_58; +assign LSB_OUT[59] = r_LSB_OUT_59; +assign LSB_OUT[60] = r_LSB_OUT_60; +assign LSB_OUT[61] = r_LSB_OUT_61; +assign LSB_OUT[62] = r_LSB_OUT_62; +assign LSB_OUT[63] = r_LSB_OUT_63; + +assign MSB_DUM[0 ] = r_MSB_DUM_0 ; +assign MSB_DUM[1 ] = r_MSB_DUM_1 ; +assign MSB_DUM[2 ] = r_MSB_DUM_2 ; +assign MSB_DUM[3 ] = r_MSB_DUM_3 ; +assign MSB_DUM[4 ] = r_MSB_DUM_4 ; +assign MSB_DUM[5 ] = r_MSB_DUM_5 ; +assign MSB_DUM[6 ] = r_MSB_DUM_6 ; +assign MSB_DUM[7 ] = r_MSB_DUM_7 ; +assign MSB_DUM[8 ] = r_MSB_DUM_8 ; +assign MSB_DUM[9 ] = r_MSB_DUM_9 ; +assign MSB_DUM[10] = r_MSB_DUM_10; +assign MSB_DUM[11] = r_MSB_DUM_11; +assign MSB_DUM[12] = r_MSB_DUM_12; +assign MSB_DUM[13] = r_MSB_DUM_13; +assign MSB_DUM[14] = r_MSB_DUM_14; +assign MSB_DUM[15] = r_MSB_DUM_15; +assign MSB_DUM[16] = r_MSB_DUM_16; +assign MSB_DUM[17] = r_MSB_DUM_17; +assign MSB_DUM[18] = r_MSB_DUM_18; +assign MSB_DUM[19] = r_MSB_DUM_19; +assign MSB_DUM[20] = r_MSB_DUM_20; +assign MSB_DUM[21] = r_MSB_DUM_21; +assign MSB_DUM[22] = r_MSB_DUM_22; +assign MSB_DUM[23] = r_MSB_DUM_23; +assign MSB_DUM[24] = r_MSB_DUM_24; +assign MSB_DUM[25] = r_MSB_DUM_25; +assign MSB_DUM[26] = r_MSB_DUM_26; +assign MSB_DUM[27] = r_MSB_DUM_27; +assign MSB_DUM[28] = r_MSB_DUM_28; +assign MSB_DUM[29] = r_MSB_DUM_29; +assign MSB_DUM[30] = r_MSB_DUM_30; +assign MSB_DUM[31] = r_MSB_DUM_31; +assign MSB_DUM[32] = r_MSB_DUM_32; +assign MSB_DUM[33] = r_MSB_DUM_33; +assign MSB_DUM[34] = r_MSB_DUM_34; +assign MSB_DUM[35] = r_MSB_DUM_35; +assign MSB_DUM[36] = r_MSB_DUM_36; +assign MSB_DUM[37] = r_MSB_DUM_37; +assign MSB_DUM[38] = r_MSB_DUM_38; +assign MSB_DUM[39] = r_MSB_DUM_39; +assign MSB_DUM[40] = r_MSB_DUM_40; +assign MSB_DUM[41] = r_MSB_DUM_41; +assign MSB_DUM[42] = r_MSB_DUM_42; +assign MSB_DUM[43] = r_MSB_DUM_43; +assign MSB_DUM[44] = r_MSB_DUM_44; +assign MSB_DUM[45] = r_MSB_DUM_45; +assign MSB_DUM[46] = r_MSB_DUM_46; +assign MSB_DUM[47] = r_MSB_DUM_47; +assign MSB_DUM[48] = r_MSB_DUM_48; +assign MSB_DUM[49] = r_MSB_DUM_49; +assign MSB_DUM[50] = r_MSB_DUM_50; +assign MSB_DUM[51] = r_MSB_DUM_51; +assign MSB_DUM[52] = r_MSB_DUM_52; +assign MSB_DUM[53] = r_MSB_DUM_53; +assign MSB_DUM[54] = r_MSB_DUM_54; +assign MSB_DUM[55] = r_MSB_DUM_55; +assign MSB_DUM[56] = r_MSB_DUM_56; +assign MSB_DUM[57] = r_MSB_DUM_57; +assign MSB_DUM[58] = r_MSB_DUM_58; +assign MSB_DUM[59] = r_MSB_DUM_59; +assign MSB_DUM[60] = r_MSB_DUM_60; +assign MSB_DUM[61] = r_MSB_DUM_61; +assign MSB_DUM[62] = r_MSB_DUM_62; +assign MSB_DUM[63] = r_MSB_DUM_63; +endmodule \ No newline at end of file diff --git a/DA4008_V1.2/rtl/fifo/syn_fwft_fifo.v b/DA4008_V1.2/rtl/fifo/syn_fwft_fifo.v new file mode 100644 index 0000000..39e03cd --- /dev/null +++ b/DA4008_V1.2/rtl/fifo/syn_fwft_fifo.v @@ -0,0 +1,203 @@ + +//////////////////////////////////////////////// +//Engineer: Xiaodong Zhong +//Date: 2019.5.21 +//Description: ?????ram +//////////////////////////////////////////////// +module syn_fwft_fifo #( +parameter width =16, +parameter depth =1024, +parameter prog_full_thre =512, +parameter prog_empty_thre =16 +)( +input clk, +input rst, +input clr, + +input wr_en, +input [width-1:0] din, +output full, +output almost_full, +output prog_full, + + +input rd_en, +output [width-1:0] dout, +output empty, +output almost_empty, +output prog_empty, + +output [clog2(depth-1)-1:0] cnt +); +//////////////////////////////////////////////// +//log2 function +//////////////////////////////////////////////// +function integer clog2(input integer depth); +begin + for(clog2=0;depth>0;clog2=clog2+1) + depth =depth>>1; +end +endfunction + +localparam aw = clog2(depth-1); + +//////////////////////////////////////////////// +//reg & wire +//////////////////////////////////////////////// +reg [aw-1:0] wr_p; +reg [aw-1:0] rd_p; +wire [aw-1:0] rd_p_next; + +reg [aw:0] i; +reg wr_en_dly; + +wire [width-1:0] ram_dout; +wire ram_rden; +//////////////////////////////////////////////// +//combinational logic +//////////////////////////////////////////////// +//assign cnt = (wr_p >= rd_p) ? wr_p - rd_p : depth-rd_p+wr_p; + + +assign full = (i>=(depth-1)) ? 1'b1 : 1'b0; +assign almost_full = (i >=(depth-4)) ? 1'b1 : 1'b0; +assign prog_full = (i >= (prog_full_thre-1)) ? 1'b1 :1'b0; + +assign empty = (i==1'b0) ? 1'b1 : 1'b0; +assign almost_empty = (i<=1'b1) ? 1'b1 : 1'b0; +assign prog_empty = (i<=prog_empty_thre) ? 1'b1 :1'b0; + +assign cnt = i[clog2(depth-1)-1:0]; + +assign rd_p_next = rd_p + {{(aw-2){1'b0}}, (rd_en & !empty)}; +//////////////////////////////////////////////// +//timing +//////////////////////////////////////////////// +reg wr_clr_r; +reg wr_clr; +//---------------------------------------------- +always @(posedge clk or posedge clr) + if(clr) + wr_clr <= 1'b1; + else if(!wr_clr_r) + wr_clr <= 1'b0;// Release Clear + +always @(posedge clk or posedge clr) + if(clr) + wr_clr_r <= 1'b1; + else + wr_clr_r <= 1'b0; +//---------------------------------------------- +always@(posedge clk or posedge rst)begin + if(rst )begin + wr_en_dly <=1'b0; + end + else begin + wr_en_dly <=wr_en; + end +end + +always@(posedge clk or posedge rst)begin + if(rst )begin + wr_p <=0; + end + else if(wr_clr)begin + wr_p <=0; + end + else if(wr_en)begin + if(wr_p == depth-1)begin + wr_p <=0; + end + else begin + wr_p <=wr_p+1; + end + end + else begin + wr_p <=wr_p; + end +end + +//---------------------------------------------- +always@(posedge clk or posedge rst)begin + if(rst )begin + rd_p <=0; + end + else if(wr_clr)begin + rd_p <=0; + end + else if(rd_en)begin + if(rd_p == depth-1)begin + rd_p <=0; + end + else begin + rd_p <=rd_p+1; + end + end + else begin + rd_p <=rd_p; + end +end + +//---------------------------------------------- +always@(posedge clk or posedge rst)begin + if(rst)begin + i <=0; + end + else if(wr_clr)begin + i <=0; + end + else begin + case({wr_en_dly,rd_en}) + 2'b00:begin + i <=i; + end + 2'b01:begin + if(i!=0)begin + i <=i-1'b1; + end + else begin + i <=i; + end + end + 2'b10:begin + if(i!=depth)begin + i <=i+1'b1; + end + else begin + i <=i; + end + end + 2'b11:begin + i <=i; + end + default:begin + i <=i; + end + endcase + end +end +//////////////////////////////////////////////// +//SRAM +//////////////////////////////////////////////// +spram #( + .width (width ), + .depth (depth ) +)spram( + .clka (clk ), + .ena (wr_en ), + .dina (din ), + .addra (wr_p ), + + .clkb (clk ), + //.enb (1'b1 ), + .enb (ram_rden ), + .doutb (ram_dout ), + .addrb (rd_p_next ) +); + +assign ram_rden = wr_p != rd_p_next; +assign dout = empty ? 0 : ram_dout; + +endmodule + + diff --git a/DA4008_V1.2/rtl/io/iopad.v b/DA4008_V1.2/rtl/io/iopad.v new file mode 100644 index 0000000..48b855b --- /dev/null +++ b/DA4008_V1.2/rtl/io/iopad.v @@ -0,0 +1,187 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : iopad.v +// Department : +// Author : pwy +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 1.2 2024-06-12 pwy Integrate a digital module and two SPI modules with PLL +// 1.3 2024-11-12 pwy Adding an Attenuator Configuration Interface +// 1.4 2025-08-14 pwy Modify IRQ output logic +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- +`include "../define/chip_define.v" +module iopad ( + //+++++++++++++++++++++++++++++++++++++++++++++// + // PAD Strat // + //+++++++++++++++++++++++++++++++++++++++++++++// + input PI_async_rstn // hardware Reset, active low + //sync + ,input PI_sync_in // Chip synchronization signal input, high pulse valid + ,output PO_sync_out // Chip synchronization signal output, high pulse valid + //spi port + ,input PI_sclk // Spi Clock + ,input PI_csn // Spi Chip Select active low + ,input PI_mosi // Spi Mosi + ,output PO_miso // Spi Miso + //irq + ,output PO_irq // Interrupt signal in the chip, high level active + //+++++++++++++++++++++++++++++++++++++++++++++// + // PAD End // + //+++++++++++++++++++++++++++++++++++++++++++++// + + //+++++++++++++++++++++++++++++++++++++++++++++// + // Internal signal Start // + //+++++++++++++++++++++++++++++++++++++++++++++// + ,output async_rstn // hardware Reset, active low + //sync + ,output sync_in // Chip synchronization signal to analog, high pulse valid + ,input sync_out // Chip synchronization signal output, high pulse valid + //spi port + ,output sclk // Spi Clock + ,output csn // Spi Chip Select active low + ,output mosi // Spi Mosi + ,input miso // Spi Miso + ,input oen // Spi Miso output enable + //irq + ,input irq_n // Interrupt signal in the chip, high level active +); + +`ifdef TSMC_IC +//++++++++++++++++++++++++++++++++++++++++++++++++++// +// ASIC PAD --> TSMC // +//++++++++++++++++++++++++++++++++++++++++++++++++++// +//PI_async_rstn,pull-up +PDUW04SDGZ_V_G PDUW08SDGZ_V_G_async_rstn ( + .I ( 1'b0 ) + ,.OEN ( 1'b1 ) + ,.REN ( 1'b0 ) + ,.PAD ( PI_async_rstn ) + ,.C ( async_rstn ) +); + +//sync_in,pull-down +PDDW04SDGZ_V_G PDDW04SDGZ_V_G_sync_in ( + .I ( 1'b0 ) + ,.OEN ( 1'b1 ) + ,.REN ( 1'b0 ) + ,.PAD ( PI_sync_in ) + ,.C ( sync_in ) +); + +//sync_out,pull-down +PDDW04SDGZ_V_G PDDW08SDGZ_V_G_sync_out ( + .I ( sync_out ) + ,.OEN ( 1'b0 ) + ,.REN ( 1'b0 ) + ,.PAD ( PO_sync_out ) + ,.C ( ) +); + +//sclk,pull-up +PDUW04SDGZ_V_G PDUW04SDGZ_V_G_sclk ( + .I ( 1'b0 ) + ,.OEN ( 1'b1 ) + ,.REN ( 1'b0 ) + ,.PAD ( PI_sclk ) + ,.C ( sclk ) +); + +//csn,pull-up +PDUW04SDGZ_V_G PDUW04SDGZ_V_G_csn ( + .I ( 1'b0 ) + ,.OEN ( 1'b1 ) + ,.REN ( 1'b0 ) + ,.PAD ( PI_csn ) + ,.C ( csn ) +); + +//mosi,pull-up +PDUW08SDGZ_V_G PDUW08SDGZ_V_G_mosi ( + .I ( 1'b0 ) + ,.OEN ( 1'b1 ) + ,.REN ( 1'b0 ) + ,.PAD ( PI_mosi ) + ,.C ( mosi ) +); + +//miso,pull-up +PDUW08SDGZ_V_G PDUW08SDGZ_V_G_miso ( + .I ( miso ) + ,.OEN ( oen ) + ,.REN ( 1'b0 ) + ,.PAD ( PO_miso ) + ,.C ( ) +); + +//irq,pull-up +PDUW08SDGZ_V_G PDUW08SDGZ_V_G_irq ( + .I ( 1'b0 ) + ,.OEN ( irq_n ) + ,.REN ( 1'b0 ) + ,.PAD ( PO_irq ) + ,.C ( ) +); + + + +`elsif XILINX_FPGA +//++++++++++++++++++++++++++++++++++++++++++++++++++// +// FPGA PAD --> Xlinx // +//++++++++++++++++++++++++++++++++++++++++++++++++++// +//async_rstn +assign async_rstn = PI_async_rstn ; +//sync_in +assign sync_to_analog = PI_sync_in ; +//sync_out +assign PO_sync_out = sync_out ; +//Feedback signal +assign ch0_feedback = PI_ch0_feedback ; +`ifdef CHANNEL_IS_FOUR +assign ch1_feedback = PI_ch1_feedback ; +assign ch2_feedback = PI_ch2_feedback ; +assign ch3_feedback = PI_ch3_feedback ; +`endif +//config chip id +assign cfgid = PI_cfgid ; +//spi port +assign sclk = PI_sclk ; +assign csn = PI_csn ; +assign mosi = PI_mosi ; +assign PO_miso = oen ? 1'bz : miso ; +//irq +assign PO_irq = irq_n ; + +`ifdef CHANNEL_IS_FOUR +assign PO_ch0_att = ch0_att ; +assign PO_ch1_att = ch1_att ; +assign PO_ch2_att = ch2_att ; +assign PO_ch3_att = ch3_att ; +`endif + +`endif + +endmodule +`include "../define/chip_undefine.v" diff --git a/DA4008_V1.2/rtl/lvds/ulink_rx.sv b/DA4008_V1.2/rtl/lvds/ulink_rx.sv new file mode 100644 index 0000000..66e57dd --- /dev/null +++ b/DA4008_V1.2/rtl/lvds/ulink_rx.sv @@ -0,0 +1,765 @@ +// ============================================================================ +// Top Module: ulink_rx +// Integrates training, descrambling, and frame reception, outputs 512-bit block writes to SRAM +// ============================================================================ +module ulink_rx #( + parameter FIFO_DEPTH = 64, // Input FIFO depth + parameter [31:0] SCRAMBLER_SEED = 32'hFFFFFFFF // Fixed seed for descrambler (all lanes share) +)( + input logic clk + ,input logic rst_n // Active-low reset + // 4-lane serial input + ,input logic [3 :0] serial_in + // Training parameters + ,input logic [19 :0] patn_count + ,input logic [2 :0] tap_step + ,input logic [2 :0] tap_adj_mask // Delay adjustment mask + ,input logic [0 :0] tap_force // Delay force to tap_step + ,input logic force_train + ,input logic descram_en + ,input logic always_on + ,input logic prefilling + ,output logic prefill_start + // Link status outputs + ,output logic link_down + ,output logic train_ready + ,output logic [2 :0] delay_tap + ,output logic tap_adj_req + // SRAM write interface (each block is 512 bits) + ,output logic [12 :0] wr_addr + ,output logic [511:0] wr_data + ,output logic wr_en + ,output logic [63 :0] byte_mask + // CRC error indication (can be used for external monitoring or to restart training) + ,output logic crc_error + ,output logic frame_done + ,output logic [31 :0] train_status + ,output logic [31 :0] frame_status +); + +// Internal connection signals +//logic train_ready; // Training ready (not used, but can be exported) +logic data_valid; // Data valid pulse from training module +logic [127:0] data_int; // 128-bit data from training module +logic [127:0] descrambled_data; // Descrambled data +logic descrambled_valid; // Descrambled data valid +logic [0 :0] train_en; // Training enable +logic [3 :0] descram_valid; + +// ======================================================================== +// prefill module instantiation +// ======================================================================== +prefill #( + .DELAY ( 20'd10000 ) +) U_prefill ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.always_on ( always_on ) + ,.prefilling ( prefilling ) + ,.prefill_start ( prefill_start ) + ,.prefill_done ( train_en ) +); + + +// ======================================================================== +// Training module instantiation +// ======================================================================== +ulink_rx_train u_train ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.serial_in ( serial_in ) + ,.patn_count ( patn_count ) + ,.frame_error ( crc_error ) // Frame error feedback to restart training + ,.frame_done ( frame_done ) + ,.tap_step ( tap_step ) + ,.tap_adj_mask ( tap_adj_mask ) + ,.tap_force ( tap_force ) + ,.force_train ( force_train ) + ,.train_en ( train_en ) + ,.link_down ( link_down ) + ,.delay_tap ( delay_tap ) + ,.tap_adj_req ( tap_adj_req ) + ,.train_ready ( train_ready ) + ,.descram_valid ( descram_valid ) + ,.data_valid ( data_valid ) + ,.data_out ( data_int ) + ,.train_status ( train_status ) +); + + +// ======================================================================== +// Descrambler module instantiation (128-bit, all lanes share the same seed) +// ======================================================================== +ulink_descrambler_128 #( + .SEED ( SCRAMBLER_SEED ) +) u_descrambler ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.data_in ( data_int ) + ,.valid_in ( descram_valid ) + ,.enable ( descram_en ) // Always enable descrambling + ,.data_out ( descrambled_data ) + ,.valid_out ( descrambled_valid ) +); + +// ======================================================================== +// Frame receiver module instantiation +// ======================================================================== +ulink_frame_receiver #( + .FIFO_DEPTH ( FIFO_DEPTH ) +) u_frame ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.data_in ( descrambled_data ) + ,.valid_in ( descrambled_valid ) + ,.wr_addr ( wr_addr ) + ,.wr_data ( wr_data ) + ,.wr_en ( wr_en ) + ,.byte_mask ( byte_mask ) + ,.crc_error ( crc_error ) + ,.frame_done ( frame_done ) + ,.frame_status ( frame_status ) +); + +endmodule + + +// ============================================================================ +// Sub-module definitions (can be placed in separate files as needed) +// ============================================================================ + +// ---------------------------------------------------------------------------- +// 32-bit Descrambler (used inside the 128-bit descrambler) +// ---------------------------------------------------------------------------- +module ulink_descrambler_32 #( + parameter [31:0] SEED = 32'hFFFFFFFF +) ( + input logic clk + ,input logic rst_n + ,input logic [31:0] data_in + ,input logic valid_in + ,input logic enable + ,output logic [31:0] data_out + ,output logic valid_out +); + logic [31:0] lfsr, next_lfsr; + wire feedback = lfsr[31] ^ lfsr[30] ^ lfsr[29] ^ lfsr[28]; + assign next_lfsr = {lfsr[30:0], feedback}; + + always_ff @(posedge clk or negedge rst_n) begin + if (!rst_n) + lfsr <= SEED; + else if (valid_in && enable) + lfsr <= next_lfsr; + end + + logic [31:0] descrambled; + assign descrambled = valid_in && enable ? (data_in ^ lfsr) : data_in; + + always_ff @(posedge clk or negedge rst_n) begin + if (!rst_n) begin + data_out <= 32'h0; + valid_out <= 1'b0; + end else begin + data_out <= descrambled; + valid_out <= valid_in; + end + end +endmodule + + +// ---------------------------------------------------------------------------- +// 128-bit Descrambler (composed of four 32-bit descramblers) +// ---------------------------------------------------------------------------- +module ulink_descrambler_128 #( + parameter [31:0] SEED = 32'hFFFFFFFF +) ( + input logic clk + ,input logic rst_n + ,input logic [127:0] data_in + ,input logic [3 :0] valid_in + ,input logic enable + ,output logic [127:0] data_out + ,output logic valid_out +); + logic [31:0] lane0_out, lane1_out, lane2_out, lane3_out; + logic valid_out0, valid_out1, valid_out2, valid_out3; + + ulink_descrambler_32 #(.SEED(SEED)) u0 ( + .clk (clk), + .rst_n (rst_n), + .data_in (data_in[31:0]), + .valid_in (valid_in[0]), + .enable (enable), + .data_out (lane0_out), + .valid_out(valid_out0) + ); + ulink_descrambler_32 #(.SEED(SEED)) u1 ( + .clk (clk), + .rst_n (rst_n), + .data_in (data_in[63:32]), + .valid_in (valid_in[1]), + .enable (enable), + .data_out (lane1_out), + .valid_out(valid_out1) + ); + ulink_descrambler_32 #(.SEED(SEED)) u2 ( + .clk (clk), + .rst_n (rst_n), + .data_in (data_in[95:64]), + .valid_in (valid_in[2]), + .enable (enable), + .data_out (lane2_out), + .valid_out(valid_out2) + ); + ulink_descrambler_32 #(.SEED(SEED)) u3 ( + .clk (clk), + .rst_n (rst_n), + .data_in (data_in[127:96]), + .valid_in (valid_in[3]), + .enable (enable), + .data_out (lane3_out), + .valid_out(valid_out3) + ); + + assign data_out = {lane3_out, lane2_out, lane1_out, lane0_out}; + assign valid_out = valid_out1; // All lanes are synchronized +endmodule + + +// ---------------------------------------------------------------------------- +// CRC32 Module (used in frame receiver) +// ---------------------------------------------------------------------------- +module crc32 #( + parameter POLY = 32'h04C11DB7 + ,parameter INIT = 32'hFFFFFFFF +)( + input logic clk + ,input logic rst_n + ,input logic clear + ,input logic [31:0] data + ,input logic valid + ,output logic [31:0] crc +); + logic [31:0] crc_reg, crc_next; + integer i; + logic data_bit; + + always_ff @(posedge clk or negedge rst_n) begin + if (!rst_n) + crc_reg <= INIT; + else if (clear) + crc_reg <= INIT; + else if (valid) + crc_reg <= crc_next; + end + + always_comb begin + crc_next = crc_reg; + for (i = 0; i < 32; i++) begin + data_bit = crc_next[31] ^ data[31-i]; + crc_next = {crc_next[30:0], 1'b0}; + if (data_bit) crc_next = crc_next ^ POLY; + end + end + assign crc = crc_reg; +endmodule + + +// ---------------------------------------------------------------------------- +// Frame Receiver Module (uses syn_fwft_fifo) +// ---------------------------------------------------------------------------- +module ulink_frame_receiver #( + parameter FIFO_DEPTH = 64 +)( + input logic clk + ,input logic rst_n + ,input logic [127:0] data_in + ,input logic valid_in + ,output logic [12:0] wr_addr + ,output logic [511:0] wr_data + ,output logic wr_en + ,output logic [63:0] byte_mask + ,output logic [31:0] frame_status + ,output logic crc_error + ,output logic frame_done +); +// Frame header constant +localparam FRAME_HEADER = 32'hBCBCBCBC; + + + + +// FIFO instantiation +logic fifo_rd_en; +logic [127:0] fifo_dout; +logic fifo_empty; + +//syn_fwft_fifo +syn_fwft_fifo #( + .width ( 128 ) + ,.depth ( FIFO_DEPTH ) + ) u_fifo ( + .clk ( clk ) + ,.rst ( ~rst_n ) + ,.clr ( 1'b0 ) + ,.wr_en ( valid_in ) + ,.din ( data_in ) + ,.full ( ) + ,.almost_full ( ) + ,.prog_full ( ) + ,.rd_en (fifo_rd_en ) + ,.dout (fifo_dout ) + ,.empty (fifo_empty ) + ,.almost_empty ( ) + ,.prog_empty ( ) + ,.cnt ( ) +); + +// Split 128-bit data into four 32-bit words +typedef enum logic [2:0] { S_IDLE, S_WORD0, S_WORD1, S_WORD2, S_WORD3 } word_state_t; +word_state_t word_state_c, word_state_n; + +// ------------------------------------------------------ +// -- word state machine +// ------------------------------------------------------ + +//jump conditions +wire idle2word0 = (word_state_c == S_IDLE ) && !fifo_empty; +wire word02word1 = (word_state_c == S_WORD0 ) ; +wire word12word2 = (word_state_c == S_WORD1 ) ; +wire word22word3 = (word_state_c == S_WORD2 ) ; +wire word32idle = (word_state_c == S_WORD3 ) ; + + +//state_n +assign word_state_n = ((word_state_c == S_IDLE ) && idle2word0 ) ? S_WORD0 : + ((word_state_c == S_WORD0 ) && word02word1 ) ? S_WORD1 : + ((word_state_c == S_WORD1 ) && word12word2 ) ? S_WORD2 : + ((word_state_c == S_WORD2 ) && word22word3 ) ? S_WORD3 : + ((word_state_c == S_WORD3 ) && word32idle ) ? S_IDLE : + word_state_c ; +//word_state_c +sirv_gnrl_edffr #(.T(word_state_t)) word_state_c_dffr (word_state_n,word_state_c,clk, rst_n); + + +//fifo_rd_en +assign fifo_rd_en = idle2word0; + +wire [127:0] current_fifo_data; + +sirv_gnrl_dfflr #(128) current_fifo_data_dfflr (fifo_rd_en, fifo_dout, current_fifo_data, clk, rst_n); + +wire [31:0] current_word_w = (word_state_c == S_WORD0) ? current_fifo_data[31:0] : + (word_state_c == S_WORD1) ? current_fifo_data[63:32] : + (word_state_c == S_WORD2) ? current_fifo_data[95:64] : + (word_state_c == S_WORD3) ? current_fifo_data[127:96] : + 32'h0; +wire word_valid_w = (word_state_c != S_IDLE); + +wire [31:0] current_word; + +sirv_gnrl_dfflr #(32) current_word_dfflr (word_valid_w, current_word_w, current_word, clk, rst_n); + +wire word_valid; + +sirv_gnrl_dffr #(1) word_valid_dffr (word_valid_w, word_valid, clk, rst_n); + +// ------------------------------------------------------ +// -- Frame parsing FSM +// ------------------------------------------------------ +typedef enum logic [2:0] { ST_IDLE, ST_HEAD, ST_DATA, ST_CRC } state_t; +state_t state_c, state_n; + +//data_len +wire [15:0] data_len; +sirv_gnrl_dfflr #(16) data_len_dfflr ((state_c == ST_HEAD ), current_word[15:0], data_len, clk, rst_n); +//data_cnt contrl +wire [15:0] data_cnt; +wire add_data_cnt = (state_c == ST_DATA ) && word_valid; +wire end_data_cnt = add_data_cnt && (state_c == ST_DATA ) && (data_cnt == data_len -1); + +wire [15:0] data_cnt_n = end_data_cnt ? 5'h0 : + add_data_cnt ? data_cnt + 1'b1 : + data_cnt ; + +sirv_gnrl_dffr #(16) data_cnt_dffr (data_cnt_n, data_cnt, clk, rst_n); + + +//jump conditions +wire idle2head = (state_c == ST_IDLE ) && (word_valid && current_word == FRAME_HEADER); +wire head2data = (state_c == ST_HEAD ) && word_valid; +wire data2crc = (state_c == ST_DATA ) && end_data_cnt; +wire crc2idle = (state_c == ST_CRC ) && word_valid; + +//state_n +assign state_n = ((state_c == ST_IDLE ) && idle2head ) ? ST_HEAD : + ((state_c == ST_HEAD ) && head2data ) ? ST_DATA : + ((state_c == ST_DATA ) && data2crc ) ? ST_CRC : + ((state_c == ST_CRC ) && crc2idle ) ? ST_IDLE : + state_c ; +//state_c +sirv_gnrl_edffr #(.T(state_t)) state_c_dffr (state_n,state_c,clk, rst_n); + + +//cur_block_offset +wire [3:0] cur_block_offset; + +wire add_cur_block_offset = (state_c == ST_DATA ) && word_valid; +wire end_cur_block_offset = (state_c == ST_DATA ) && add_cur_block_offset && (cur_block_offset == 16-1);; + +wire [3:0] cur_block_offset_n = end_cur_block_offset ? 5'h0 : + (state_c == ST_HEAD ) ? current_word[19:16] : + add_cur_block_offset ? cur_block_offset + 1'b1 : + cur_block_offset ; + +sirv_gnrl_dffr #(4) cur_block_offset_dffr (cur_block_offset_n, cur_block_offset, clk, rst_n); + +//block_done +wire block_done; + +sirv_gnrl_dffr #(1) block_done_dffr ((state_c == ST_DATA) && ((end_data_cnt && !end_cur_block_offset) || end_cur_block_offset), block_done, clk, rst_n); + +//base_addr +wire [15:0] base_addr; +sirv_gnrl_dfflr #(16) base_addr_dfflr ((state_c == ST_HEAD ), current_word[31:16], base_addr, clk, rst_n); + +//cur_block_addr +wire [12:0] cur_block_addr; +wire [12:0] cur_block_addr_w = end_cur_block_offset ? cur_block_addr + 1'b1 : + (state_c == ST_HEAD) ? current_word[31:16] >> 4 : + crc2idle ? 13'd0 : + cur_block_addr; + +sirv_gnrl_dffr #(13) cur_block_addr_dffr (cur_block_addr_w, cur_block_addr, clk, rst_n); + +//cur_block_data +wire [31:0] cur_block_data [15:0]; + + +genvar i; +generate + for (i = 0; i < 16; i++) begin : gen_block_data + wire load_sel = (state_c == ST_DATA) && (cur_block_offset == i); + sirv_gnrl_dfflr #(32) cur_block_data_dfflr (load_sel, current_word, cur_block_data[i], clk, rst_n); + end +endgenerate + + +//cur_block_mask +wire [63:0] cur_block_mask; + +wire clear_mask = (state_c == ST_HEAD) || block_done; + +genvar j; +generate + for (j = 0; j < 16; j++) begin : gen_mask + wire load_sel_mask = (state_c == ST_DATA) && (cur_block_offset == j); + wire load_en = load_sel_mask || clear_mask; + wire [3:0] dnxt = load_sel_mask ? 4'b1111 : + clear_mask ? 4'b0000 : + 4'b1111; + sirv_gnrl_dfflr #(4) cur_block_mask_dfflr (load_en, dnxt, cur_block_mask[j*4 +: 4], clk, rst_n); + end +endgenerate + + + +//SRAM Write Ouput Contrl + +//wr_addr +wire [12:0] cur_block_addr_r; +sirv_gnrl_dffr #(13) cur_block_addr_r_dffr (cur_block_addr, cur_block_addr_r, clk, rst_n); +sirv_gnrl_dfflr #(13) wr_addr_dfflr (block_done, cur_block_addr_r, wr_addr, clk, rst_n); + +//wr_data +wire [511:0] cur_block_data_packed; +genvar k; +generate + for (k = 0; k < 16; k++) begin : pack_cur_block_data + assign cur_block_data_packed[32*k +: 32] = cur_block_data[k]; + end +endgenerate + +sirv_gnrl_dfflr #(512) wr_data_dfflr (block_done, cur_block_data_packed, wr_data, clk, rst_n); + + +//byte_mask +sirv_gnrl_dfflr #(64) byte_mask_dfflr (block_done, cur_block_mask, byte_mask, clk, rst_n); + +//wr_en +sirv_gnrl_dffr #(1) wr_en_dffr (block_done, wr_en, clk, rst_n); + +//frame_done +sirv_gnrl_dffr #(1) frame_done_dffr (crc2idle, frame_done, clk, rst_n); + +// ------------------------------------------------------ +// -- CRC32 instance +// ------------------------------------------------------ +wire crc_clear, crc_valid; +wire [31:0] crc_out; +crc32 u_crc32 ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.clear ( crc_clear ) + ,.data ( current_word ) + ,.valid ( crc_valid ) + ,.crc ( crc_out ) +); + +//CRC Contrl + +//crc_clear +sirv_gnrl_dffr #(1) crc_clear_dffr (crc2idle, crc_clear, clk, rst_n); + +//crc_valid +//sirv_gnrl_dffr #(1) crc_valid_dffr ((state_c == ST_HEAD) || (state_c == ST_DATA) && word_valid, crc_valid, clk, rst_n); +assign crc_valid = (state_c == ST_HEAD) || (state_c == ST_DATA) && word_valid; +//crc_error +sirv_gnrl_dffr #(1) crc_error_dffr (crc2idle && (current_word != crc_out), crc_error, clk, rst_n); + +wire [31:0] frame_status_w; + +assign frame_status_w[2 : 0] = state_c; +assign frame_status_w[15: 3] = base_addr[15:3]; +assign frame_status_w[31:16] = data_len; + +sirv_gnrl_dffr #(32) frame_status_dffr (frame_status_w, frame_status, clk, rst_n); +endmodule +// ---------------------------------------------------------------------------- +// Training module (provided in user's file, placeholder here) +// Note: To avoid duplication, the definition of ulink_rx_train is omitted. +// In actual use, include the original file content here or via `include. +// ---------------------------------------------------------------------------- +// Assume ulink_rx_train module exists, identical to the user-provided code. + +module ulink_rx_train ( + input logic clk + ,input logic rst_n + ,input logic [3 :0] serial_in // 4-lane serial input + ,input logic [19 :0] patn_count // Training count preset value + ,input logic frame_error // Frame error indication (from frame module) + ,input logic frame_done // Frame done indication (from frame module) + ,input logic [2 :0] tap_step // Delay adjustment step value + ,input logic [2 :0] tap_adj_mask // Delay adjustment mask + ,input logic [0 :0] tap_force // Delay force to tap_step + ,input logic force_train // Force Training + ,input logic [0 :0] train_en // Training enable + ,output logic link_down // Link down indication + ,output logic [2 :0] delay_tap // Delay adjustment value + ,output logic tap_adj_req + ,output logic train_ready // Training complete, link ready + ,output logic [127:0] data_out // Latched parallel data + ,output logic data_valid + ,output logic [3 :0] descram_valid + ,output logic [31 :0] train_status +); + +// 4 32-bit shift registers, corresponding to 4 input lanes +wire [31:0] lane0_reg, lane1_reg, lane2_reg, lane3_reg; + +sirv_gnrl_dffr #(32) lane0_reg_dffr ({lane0_reg[30:0], serial_in[0]}, lane0_reg, clk, rst_n); +sirv_gnrl_dffr #(32) lane1_reg_dffr ({lane1_reg[30:0], serial_in[1]}, lane1_reg, clk, rst_n); +sirv_gnrl_dffr #(32) lane2_reg_dffr ({lane2_reg[30:0], serial_in[2]}, lane2_reg, clk, rst_n); +sirv_gnrl_dffr #(32) lane3_reg_dffr ({lane3_reg[30:0], serial_in[3]}, lane3_reg, clk, rst_n); + + +// State definition +typedef enum logic [1:0] { + SM_DOWN, // Link down + SM_MATCH, // Match training pattern + SM_EXIT, // Wait for exit pattern + SM_READY // Link ready +} state_t; + +state_t state_c, state_n; + +localparam TRAINING_PATN = 32'h68666E6C; // "hfnl" +localparam TRAINING_EXIT = 32'h65786974; // "exit" + +// Bit counter control +wire [4:0] bit_counter; + +wire add_bit_conuter = ((state_c == SM_MATCH) || (state_c == SM_EXIT)); +wire end_bit_conuter = add_bit_conuter && (bit_counter == 32-1); + +wire [4:0] counter_m1 = end_bit_conuter ? 5'h0 : + add_bit_conuter ? bit_counter + 1'b1 : + bit_counter ; + +sirv_gnrl_dffr #(5) bit_counter_dffr (counter_m1, bit_counter, clk, rst_n); + + +// Combinational signals: all four lanes match simultaneously +wire match_en = (lane0_reg == TRAINING_PATN) && + (lane1_reg == TRAINING_PATN) && + (lane2_reg == TRAINING_PATN) && + (lane3_reg == TRAINING_PATN); +wire match_exit = (lane0_reg == TRAINING_EXIT) && + (lane1_reg == TRAINING_EXIT) && + (lane2_reg == TRAINING_EXIT) && + (lane3_reg == TRAINING_EXIT); +wire match_failed = !(match_en | match_exit) & end_bit_conuter; + +// Match counter +wire [19:0] match_counter_c; + + +wire add_match_counter = (state_c == SM_MATCH) && end_bit_conuter; + +wire end_match_counter = add_match_counter && (match_counter_c == patn_count-2); + +wire [19:0] match_counter_n = end_match_counter ? 20'h0 : + add_match_counter ? match_counter_c + 1'b1 : + match_counter_c ; + +sirv_gnrl_dffr #(20) match_counter_c_dffr (match_counter_n, match_counter_c, clk, rst_n); +// ------------------------------------------------------ +// -- state machine +// ------------------------------------------------------ + +//jump conditions +wire down2match = (state_c == SM_DOWN ) && match_en && train_en; +wire match2down = (state_c == SM_MATCH ) && match_failed; +wire match2exit = (state_c == SM_MATCH ) && end_match_counter; +wire exit2down = (state_c == SM_EXIT ) && match_failed; +wire exit2ready = (state_c == SM_EXIT ) && match_exit; +wire ready2down = (state_c == SM_READY ) && frame_error; + + +//state_n +assign state_n = ((state_c == SM_DOWN ) && down2match ) ? SM_MATCH : + ((state_c == SM_MATCH ) && (match2down || force_train )) ? SM_DOWN : + ((state_c == SM_MATCH ) && match2exit ) ? SM_EXIT : + ((state_c == SM_EXIT ) && (exit2down || force_train )) ? SM_DOWN : + ((state_c == SM_EXIT ) && exit2ready ) ? SM_READY : + ((state_c == SM_READY ) && (ready2down || force_train )) ? SM_DOWN : + state_c ; +//state_c +sirv_gnrl_edffr #(.T(state_t)) state_c_dffr (state_n,state_c,clk, rst_n); +// Delay adjustment (step controlled by tap_step) + +wire tap_adj_req_w = (tap_adj_mask[0] && match2down) || + (tap_adj_mask[1] && exit2down ) || + (tap_adj_mask[2] && ready2down) ; + +wire tap_adj_enable = tap_adj_req_w || tap_force; + +wire [2:0] delay_tap_w = tap_force ? tap_step : + delay_tap + tap_step ; + +sirv_gnrl_dfflr #(3) delay_tap_dfflr (tap_adj_enable, delay_tap_w, delay_tap, clk, rst_n); + + +sirv_gnrl_dffr #(1) tap_adj_req_dffr (tap_adj_req_w, tap_adj_req, clk, rst_n); + +// Link status outputs + +sirv_gnrl_dffr #(1) link_down_dffr ((state_c == SM_DOWN), link_down, clk, rst_n); +sirv_gnrl_dffr #(1) train_ready_dffr ((state_c == SM_READY), train_ready, clk, rst_n); + + +// ====================== +// Data output +// ====================== +wire [127:0] data_buf; +sirv_gnrl_dffr #(128) data_buf_dffr ({lane3_reg, lane2_reg, lane1_reg, lane0_reg}, data_buf, clk, rst_n); + +// Frame header constant +localparam FRAME_HEADER = 32'hBCBCBCBC; + +// ============================================================================================================== +// Data input control: In SM_READY state, latch data every 32 cycles and generate a valid pulse +// ============================================================================================================== + +//match_head +wire match_head_start; +wire match_head = (data_buf[31:0] == FRAME_HEADER); +wire match_head_start_w = match_head && train_ready ? 1'b1 : + link_down ? 1'b0 : + frame_done ? 1'b0 : + match_head_start; + +sirv_gnrl_dffr #(1) match_head_start_dffr (match_head_start_w, match_head_start, clk, rst_n); +// data counter control +wire [4:0] data_counter; + +wire add_data_conuter = match_head_start; +wire end_data_conuter = (add_data_conuter && (data_counter == 32-1) || frame_done); + +wire [4:0] data_counter_n = end_data_conuter ? 5'h0 : + add_data_conuter ? data_counter + 1'b1 : + data_counter ; + +sirv_gnrl_dffr #(5) data_counter_dffr (data_counter_n, data_counter, clk, rst_n); + +//valid_int +wire data_valid_w = (state_c == SM_READY) && (match_head || (end_data_conuter && (data_counter == 32-1))); +sirv_gnrl_dffr #(1) valid_int_dffr (data_valid_w, data_valid, clk, rst_n); + +//descram_valid +wire [3:0] descram_valid_w; +assign descram_valid_w[3:1] = {3{data_valid_w}}; +assign descram_valid_w[0] = (state_c == SM_READY) && (end_data_conuter && (data_counter == 32-1)); +sirv_gnrl_dffr #(4) descram_valid_dffr (descram_valid_w, descram_valid, clk, rst_n); + +//data_in reg +wire data_in_reg; +sirv_gnrl_dffr #(128) data_in_reg_dffr (data_buf, data_out, clk, rst_n); + +//train_status +wire [31:0] train_status_w; + +assign train_status_w[1 : 0] = state_c; +assign train_status_w[2 ] = match_en; +assign train_status_w[3 ] = match_exit; +assign train_status_w[4 ] = match_failed; +assign train_status_w[5 ] = match_head; +assign train_status_w[6 ] = match_head_start; +assign train_status_w[11: 7] = bit_counter; +assign train_status_w[31:12] = match_counter_c; + +sirv_gnrl_dffr #(32) train_status_dffr (train_status_w, train_status, clk, rst_n); + +endmodule + +// ---------------------------------------------------------------------------- +// prefill Module (used in frame receiver) +// ---------------------------------------------------------------------------- +module prefill #( + parameter DELAY = 20'd10000 +)( + input logic clk + ,input logic rst_n + ,input logic always_on + ,input logic prefilling + ,output logic prefill_start + ,output logic prefill_done +); + +// delay counter control +wire [19:0] delay_counter; + +wire add_delay_counter = ~(delay_counter == DELAY); +wire end_delay_counter = add_delay_counter && (delay_counter == DELAY-1); + +wire [19:0] delay_counter_n = end_delay_counter ? 20'h0 : + add_delay_counter ? delay_counter + 1'b1 : + delay_counter ; + +sirv_gnrl_dffr #(20) delay_counter_dffr (delay_counter_n, delay_counter, clk, rst_n); + +//prefill_start +sirv_gnrl_dffr #(1) prefill_start_dffr (end_delay_counter, prefill_start, clk, rst_n); + +//prefilling_falling +wire [1:0] prefilling_r; +sirv_gnrl_dffr #(2) prefilling_r_dffr ({prefilling_r[0],prefilling}, prefilling_r, clk, rst_n); + +wire prefilling_falling = !prefilling_r[0] && prefilling_r[1]; +//prefill_done +sirv_gnrl_dfflr #(1) prefill_done_dfflr (prefilling_falling || always_on, 1'b1, prefill_done, clk, rst_n); + + +endmodule + diff --git a/DA4008_V1.2/rtl/memory/bhv_spram.v b/DA4008_V1.2/rtl/memory/bhv_spram.v new file mode 100644 index 0000000..3e36005 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/bhv_spram.v @@ -0,0 +1,71 @@ + + +module bhv_spram ( + clka, + ena, + dina, + addra, + + clkb, + enb, + doutb, + addrb +); + +//================================================= +function integer clog2(input integer depth); +begin + for(clog2=0;depth>0;clog2=clog2+1) + depth =depth>>1; +end +endfunction +//================================================= +parameter width = 16; +parameter depth = 1024; +localparam aw = clog2(depth-1); +//================================================= +input clka ; +input ena ; +input [width-1:0] dina ; +input [aw-1:0] addra ; + +input clkb ; +input enb ; +output [width-1:0] doutb ; +input [aw-1:0] addrb ; + +//================================================ +wire clka; +wire ena; +wire [width-1:0] dina; +wire [aw-1:0] addra; + +wire clkb; +wire enb; +reg [width-1:0] doutb; +wire [aw-1:0] addrb; + +//================================================ + +reg [width-1:0] mem[0:depth-1]; + + + +always@(posedge clka)begin + if(ena)begin + mem[addra] <=dina; + end +end + +always@(posedge clkb)begin + if(enb)begin + doutb <=mem[addrb]; + end + //else begin + // doutb <=0; + //end +end + +endmodule + + diff --git a/DA4008_V1.2/rtl/memory/dpram.v b/DA4008_V1.2/rtl/memory/dpram.v new file mode 100644 index 0000000..156bf45 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/dpram.v @@ -0,0 +1,90 @@ + +`include "../define/chip_define.v" +//`define TSMC_INITIALIZE_MEM +module dpram #( + parameter DATAWIDTH = 32 + ,parameter ADDRWIDTH = 13 +)( + input PortClk + ,input [ADDRWIDTH-1 :0] PortAAddr + ,input [DATAWIDTH-1 :0] PortADataIn + ,input PortAWriteEnable //active low + ,input PortAChipEnable //active low + ,input [(DATAWIDTH/8)-1 :0] PortAByteWriteEnable //active low + ,output [DATAWIDTH-1 :0] PortADataOut + + ,input [ADDRWIDTH-1 :0] PortBAddr + ,input [DATAWIDTH-1 :0] PortBDataIn + ,input PortBWriteEnable //active low + ,input PortBChipEnable //active low + ,input [(DATAWIDTH/8)-1 :0] PortBByteWriteEnable //active low + ,output [DATAWIDTH-1 :0] PortBDataOut +); + +//================================================================================== +//XPM¡¡£í£å£í£ï£ò£ù +//================================================================================== + +`ifdef BEHAVIOR_SIM + dpram_model #( + .DATAWIDTH ( DATAWIDTH ) + ,.ADDRWIDTH ( ADDRWIDTH ) + ) dpram_model ( + .PortClk ( PortClk ) + ,.PortAWriteEnable ( PortAWriteEnable ) + ,.PortAChipEnable ( PortAChipEnable ) + ,.PortAByteWriteEnable ( PortAByteWriteEnable ) + ,.PortAAddr ( PortAAddr ) + ,.PortADataIn ( PortADataIn ) + ,.PortADataOut ( PortADataOut ) + ,.PortBWriteEnable ( PortBWriteEnable ) + ,.PortBChipEnable ( PortBChipEnable ) + ,.PortBByteWriteEnable ( PortBByteWriteEnable ) + ,.PortBAddr ( PortBAddr ) + ,.PortBDataIn ( PortBDataIn ) + ,.PortBDataOut ( PortBDataOut ) + ); +`elsif XILINX_FPGA + xil_tdpram #( + .DATAWIDTH ( DATAWIDTH ) + ,.ADDRWIDTH ( ADDRWIDTH ) + ) U_xil_tdpram ( + .PortClk ( PortClk ) + ,.PortAAddr ( PortAAddr ) + ,.PortADataIn ( PortADataIn ) + ,.PortAWriteEnable ( PortAWriteEnable ) + ,.PortAChipEnable ( PortAChipEnable ) + ,.PortAByteWriteEnable ( PortAByteWriteEnable ) + ,.PortADataOut ( PortADataOut ) + ,.PortBAddr ( PortBAddr ) + ,.PortBDataIn ( PortBDataIn ) + ,.PortBWriteEnable ( PortBWriteEnable ) + ,.PortBChipEnable ( PortBChipEnable ) + ,.PortBByteWriteEnable ( PortBByteWriteEnable ) + ,.PortBDataOut ( PortBDataOut ) + ); +`elsif TSMC_IC + tsmc_dpram #( + .DATAWIDTH ( DATAWIDTH ) + ,.ADDRWIDTH ( ADDRWIDTH ) + ) U_tsmc_dpram ( + .PortClk ( PortClk ) + ,.PortAAddr ( PortAAddr ) + ,.PortADataIn ( PortADataIn ) + ,.PortAWriteEnable ( PortAWriteEnable ) + ,.PortAChipEnable ( PortAChipEnable ) + ,.PortAByteWriteEnable ( PortAByteWriteEnable ) + ,.PortADataOut ( PortADataOut ) + ,.PortBAddr ( PortBAddr ) + ,.PortBDataIn ( PortBDataIn ) + ,.PortBWriteEnable ( PortBWriteEnable ) + ,.PortBChipEnable ( PortBChipEnable ) + ,.PortBByteWriteEnable ( PortBByteWriteEnable ) + ,.PortBDataOut ( PortBDataOut ) + ); +`endif + + +endmodule + +`include "../define/chip_undefine.v" \ No newline at end of file diff --git a/DA4008_V1.2/rtl/memory/spram (copy).v b/DA4008_V1.2/rtl/memory/spram (copy).v new file mode 100644 index 0000000..c6c40b8 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/spram (copy).v @@ -0,0 +1,101 @@ +//`define FPGA_XIL + +//`define SMIC_IC + + +`define BEHAVIOUR_SIM + + +module spram #( +parameter width =16, +parameter depth =1024 + +)( + clka, + ena, + dina, + addra, + + clkb, + enb, + doutb, + addrb +); +/////////////////////////////////////////////////////// +//Function +/////////////////////////////////////////////////////// +function integer clog2(input integer depth); +begin + for(clog2=0;depth>0;clog2=clog2+1) + depth =depth>>1; +end +endfunction + +localparam aw = clog2(depth-1); + +/////////////////////////////////////////////////////// +//Input declaration +/////////////////////////////////////////////////////// +input clka; +input ena; +input [width-1:0] dina; +input [aw-1:0] addra; + +input clkb; +input enb; +output [width-1:0] doutb; +input [aw-1:0] addrb; + +/////////////////////////////////////////////////////// +//SRAM +/////////////////////////////////////////////////////// +`ifdef BEHAVIOUR_SIM +bhv_spram #( + .width (width ), + .depth (depth ) +)bhv_spram( + .clka (clka ), + .ena (ena ), + .dina (dina ), + .addra (addra ), + .clkb (clkb ), + .enb (enb ), + .doutb (doutb ), + .addrb (addrb ) +); + +`elsif XINLINX_FPGA +xil_spram #( + .dw (width ), + .depth (depth ) +)xil_spram( + .wrclk (clka ), + .wren (ena ), + .wrdata (dina ), + .wraddr (addra ), + .rdclk (clkb ), + .rden (enb ), + .rddata (doutb ), + .rdaddr (addrb ) + ); +`elsif SMIC_IC +smic_spram #( + .width (width), + .depth (depth) +)smic_spram( + .CLKB (clka ), + .CENB (ena ), + .AB (addra ), + .DB (dina ), + + .CLKA (clkb ), + .CENA (enb ), + .AA (addrb ), + .QA (doutb ) +); +`endif +endmodule + +//`undef FPGA_XIL + + diff --git a/DA4008_V1.2/rtl/memory/spram.v b/DA4008_V1.2/rtl/memory/spram.v new file mode 100644 index 0000000..c6c40b8 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/spram.v @@ -0,0 +1,101 @@ +//`define FPGA_XIL + +//`define SMIC_IC + + +`define BEHAVIOUR_SIM + + +module spram #( +parameter width =16, +parameter depth =1024 + +)( + clka, + ena, + dina, + addra, + + clkb, + enb, + doutb, + addrb +); +/////////////////////////////////////////////////////// +//Function +/////////////////////////////////////////////////////// +function integer clog2(input integer depth); +begin + for(clog2=0;depth>0;clog2=clog2+1) + depth =depth>>1; +end +endfunction + +localparam aw = clog2(depth-1); + +/////////////////////////////////////////////////////// +//Input declaration +/////////////////////////////////////////////////////// +input clka; +input ena; +input [width-1:0] dina; +input [aw-1:0] addra; + +input clkb; +input enb; +output [width-1:0] doutb; +input [aw-1:0] addrb; + +/////////////////////////////////////////////////////// +//SRAM +/////////////////////////////////////////////////////// +`ifdef BEHAVIOUR_SIM +bhv_spram #( + .width (width ), + .depth (depth ) +)bhv_spram( + .clka (clka ), + .ena (ena ), + .dina (dina ), + .addra (addra ), + .clkb (clkb ), + .enb (enb ), + .doutb (doutb ), + .addrb (addrb ) +); + +`elsif XINLINX_FPGA +xil_spram #( + .dw (width ), + .depth (depth ) +)xil_spram( + .wrclk (clka ), + .wren (ena ), + .wrdata (dina ), + .wraddr (addra ), + .rdclk (clkb ), + .rden (enb ), + .rddata (doutb ), + .rdaddr (addrb ) + ); +`elsif SMIC_IC +smic_spram #( + .width (width), + .depth (depth) +)smic_spram( + .CLKB (clka ), + .CENB (ena ), + .AB (addra ), + .DB (dina ), + + .CLKA (clkb ), + .CENA (enb ), + .AA (addrb ), + .QA (doutb ) +); +`endif +endmodule + +//`undef FPGA_XIL + + diff --git a/DA4008_V1.2/rtl/memory/sram_dmux.sv b/DA4008_V1.2/rtl/memory/sram_dmux.sv new file mode 100644 index 0000000..c40c3e7 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/sram_dmux.sv @@ -0,0 +1,106 @@ + +/* +// module dmux +module sram_dmux_m #( + parameter ADDR_WIDTH_I = 11, // input port addr width + parameter ADDR_WIDTH_O = 10, // output port addr width + parameter DATA_WIDTH = 64 // in/output port data width +)( + input logic clk, + input logic rst_n, + sram_if.slave port_in, + sram_if.master port_out[2**(ADDR_WIDTH_I-ADDR_WIDTH_O)-1:0] +); + localparam ASEL_WIDTH = ADDR_WIDTH_I-ADDR_WIDTH_O; + logic [ASEL_WIDTH-1:0] data_sel, data_out_sel; + assign data_sel = port_in.addr[ADDR_WIDTH_I-1 : ADDR_WIDTH_O]; + always @(posedge clk or negedge rst_n) begin + if(!rst_n) begin + data_out_sel <= 0; + end else begin + data_out_sel <= data_sel; + end + end + + logic [DATA_WIDTH-1:0] dout_data[2**(ASEL_WIDTH)-1:0]; + genvar i; + generate + for (i = 0; i < 2**ASEL_WIDTH; i++) begin + assign port_out[i].addr = (i == data_sel) ? port_in.addr[ADDR_WIDTH_O-1:0] : 0; + assign port_out[i].wren = (i == data_sel) ? port_in.wren : 0; + assign port_out[i].rden = (i == data_sel) ? port_in.rden : 0; + assign port_out[i].din = (i == data_sel) ? port_in.din : 0; + assign port_out[i].wben = (i == data_sel) ? port_in.wben : 0; + assign dout_data[i]= port_out[i].dout; + end + endgenerate + assign port_in.dout = dout_data[data_out_sel]; + +endmodule +*/ + +// word dmux +module sram_dmux_w #( + parameter ADDR_WIDTH = 11, // input port addr width + parameter DATA_WIDTH_I = 32, // input port data width + parameter DATA_WIDTH_O = 64 // output port data width +)( + input logic clk, + input logic rst_n, + sram_if.slave port_in, + sram_if.master port_out +); + + // calculate and buffer word select bit + localparam DL = $clog2(DATA_WIDTH_I/8); + localparam DH = $clog2(DATA_WIDTH_O/8); + localparam WSEL_WIDTH = DH - DL; + logic [WSEL_WIDTH-1:0] data_sel, data_out_sel; + assign data_sel = port_in.addr[DH-1:DL]; + always @(posedge clk or negedge rst_n) begin + if(!rst_n) begin + data_out_sel <= 0; + end else begin + data_out_sel <= data_sel; + end + end + // + assign port_out.addr = port_in.addr; + assign port_out.wren = port_in.wren; + assign port_out.rden = port_in.rden; + genvar i; + generate + for (i = 0; i < 2**(WSEL_WIDTH); i++) begin + assign port_out.din[DATA_WIDTH_I*i +: DATA_WIDTH_I] = (i == data_sel) ? port_in.din : 0; + assign port_out.wben[DATA_WIDTH_I/8*i +: DATA_WIDTH_I/8] = (i == data_sel) ? port_in.wben : 0; + end + endgenerate + assign port_in.dout = port_out.dout[DATA_WIDTH_I*data_out_sel +: DATA_WIDTH_I]; + +endmodule + +/* +// data split +module sram_split #( + parameter ADDR_WIDTH = 11, // input port addr width + parameter DATA_WIDTH_I = 64, // input port data width + parameter DATA_WIDTH_O = 32 // output port data width +)( + sram_if.slave port_in, + sram_if.master port_out[DATA_WIDTH_I/DATA_WIDTH_O-1:0] +); + localparam DH = $clog2(DATA_WIDTH_I/8); + localparam DL = $clog2(DATA_WIDTH_O/8); + genvar i; + generate + for (i = 0; i < DATA_WIDTH_I/DATA_WIDTH_O; i++) begin + assign port_out[i].addr = {port_in.addr[ADDR_WIDTH-1:DH], {DL{1'b0}}}; + assign port_out[i].rden = port_in.rden; + assign port_out[i].wren = port_in.wren; + assign port_out[i].din = port_in.din[i*DATA_WIDTH_O +: DATA_WIDTH_O]; + assign port_out[i].wben = port_in.wben[i*DATA_WIDTH_O/8 +: DATA_WIDTH_O/8]; + assign port_in.dout[i*DATA_WIDTH_O +: DATA_WIDTH_O] = port_out[i].dout; + end + endgenerate +endmodule +*/ \ No newline at end of file diff --git a/DA4008_V1.2/rtl/memory/sram_if.sv b/DA4008_V1.2/rtl/memory/sram_if.sv new file mode 100644 index 0000000..b6560d4 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/sram_if.sv @@ -0,0 +1,58 @@ +interface sram_if #(parameter ADDR_WIDTH = 8, parameter DATA_WIDTH = 32)(input bit clk); + // Signals for interfacing with the SRAM + logic [ADDR_WIDTH-1:0] addr; + logic [DATA_WIDTH-1:0] din; + logic [DATA_WIDTH-1:0] dout; + logic rden; + logic wren; + logic [DATA_WIDTH/8-1:0] wben; + + modport master( + output addr, + output din, + input dout, + output wren, + output rden, + output wben + ); + + modport slave ( + input addr, + input din, + output dout, + input wren, + input rden, + input wben + ); + /* +// synopsys translate_off + // write operation + task write; + input logic [ADDR_WIDTH-1:0] addr_in; + input logic [DATA_WIDTH-1:0] data_in; + input logic [DATA_WIDTH/8-1:0] byte_enable; + begin + addr = addr_in; + din = data_in; + wben = byte_enable; + wren = 1; + rden = 0; + @(posedge clk); + wren = 0; + end + endtask + + // read oepration + task read; + input logic [ADDR_WIDTH-1:0] addr_in; + begin + addr = addr_in; + wren = 0; + rden = 1; + @(posedge clk); + rden = 0; + end + endtask +// synopsys translate_on +*/ +endinterface \ No newline at end of file diff --git a/DA4008_V1.2/rtl/memory/tsmc_dpram.v b/DA4008_V1.2/rtl/memory/tsmc_dpram.v new file mode 100644 index 0000000..cc78d31 --- /dev/null +++ b/DA4008_V1.2/rtl/memory/tsmc_dpram.v @@ -0,0 +1,172 @@ + + +module tsmc_dpram #( + parameter DATAWIDTH = 32 + ,parameter ADDRWIDTH = 14 +)( + input PortClk + ,input [ADDRWIDTH-1 :0] PortAAddr + ,input [DATAWIDTH-1 :0] PortADataIn + ,input PortAWriteEnable //active low + ,input PortAChipEnable //active low + ,input [(DATAWIDTH/8)-1 :0] PortAByteWriteEnable //active low + ,output [DATAWIDTH-1 :0] PortADataOut + + ,input [ADDRWIDTH-1 :0] PortBAddr + ,input [DATAWIDTH-1 :0] PortBDataIn + ,input PortBWriteEnable //active low + ,input PortBChipEnable //active low + ,input [(DATAWIDTH/8)-1 :0] PortBByteWriteEnable //active low + ,output [DATAWIDTH-1 :0] PortBDataOut +); +//////////////////////////////////////////////////////////////////////////////// +//Function +//////////////////////////////////////////////////////////////////////////////// +function integer clog2(input integer bit_depth); + begin + for(clog2=0;bit_depth>0;clog2=clog2+1) + bit_depth =bit_depth>>1; + end +endfunction + +localparam LSB = clog2(DATAWIDTH/8 -1); + +generate + if((DATAWIDTH == 512) && (ADDRWIDTH == 19)) begin:spram_512X8192_generation + genvar i; + wire [DATAWIDTH-1:0] BWEBA ; + wire [DATAWIDTH-1:0] BWEBB ; + for(i = 0; i < DATAWIDTH/8; i = i + 1) begin + assign BWEBA[8*i +: 8] = {8{PortAByteWriteEnable[i]}}; + assign BWEBB[8*i +: 8] = {8{PortBByteWriteEnable[i]}}; + end + genvar k; + wire [1 :0] U_CEBA; + wire [1 :0] U_CEBB; + wire [DATAWIDTH-1:0] U_QA[1 :0]; + wire [DATAWIDTH-1:0] U_QB[1 :0]; + reg [1 :0] AA_1D_MSB; + reg [1 :0] AB_1D_MSB; + for(k = 0; k < 2; k = k + 1) begin + assign U_CEBA[k] = ~(PortAAddr[ADDRWIDTH-1] == k) | PortAChipEnable; + assign U_CEBB[k] = ~(PortBAddr[ADDRWIDTH-1] == k) | PortBChipEnable; + tsdn28hpcpuhdb4096x128m4mw_170a U0_tsdn28hpcpuhdb4096x128m4mw_170a ( + .CLK ( PortClk ) + ,.CEBA ( U_CEBA[k] ) + ,.WEBA ( PortAWriteEnable ) + ,.BWEBA ( BWEBA[127:0] ) + ,.AA ( PortAAddr[ADDRWIDTH-2:LSB] ) + ,.DA ( PortADataIn[127:0] ) + ,.QA ( U_QA[k][127:0] ) + ,.CEBB ( U_CEBB[k] ) + ,.WEBB ( PortBWriteEnable ) + ,.BWEBB ( BWEBB[127:0] ) + ,.AB ( PortBAddr[ADDRWIDTH-2:LSB] ) + ,.DB ( PortBDataIn[127:0] ) + ,.QB ( U_QB[k][127:0] ) + ,.RTSEL ( 2'b00 ) + ,.WTSEL ( 2'b00 ) + ,.PTSEL ( 2'b00 ) + ); + tsdn28hpcpuhdb4096x128m4mw_170a U1_tsdn28hpcpuhdb4096x128m4mw_170a ( + .CLK ( PortClk ) + ,.CEBA ( U_CEBA[k] ) + ,.WEBA ( PortAWriteEnable ) + ,.BWEBA ( BWEBA[255:128] ) + ,.AA ( PortAAddr[ADDRWIDTH-2:LSB] ) + ,.DA ( PortADataIn[255:128] ) + ,.QA ( U_QA[k][255:128] ) + ,.CEBB ( U_CEBB[k] ) + ,.WEBB ( PortBWriteEnable ) + ,.BWEBB ( BWEBB[255:128] ) + ,.AB ( PortBAddr[ADDRWIDTH-2:LSB] ) + ,.DB ( PortBDataIn[255:128] ) + ,.QB ( U_QB[k][255:128] ) + ,.RTSEL ( 2'b00 ) + ,.WTSEL ( 2'b00 ) + ,.PTSEL ( 2'b00 ) + ); + tsdn28hpcpuhdb4096x128m4mw_170a U2_tsdn28hpcpuhdb4096x128m4mw_170a ( + .CLK ( PortClk ) + ,.CEBA ( U_CEBA[k] ) + ,.WEBA ( PortAWriteEnable ) + ,.BWEBA ( BWEBA[383:256] ) + ,.AA ( PortAAddr[ADDRWIDTH-2:LSB] ) + ,.DA ( PortADataIn[383:256] ) + ,.QA ( U_QA[k][383:256] ) + ,.CEBB ( U_CEBB[k] ) + ,.WEBB ( PortBWriteEnable ) + ,.BWEBB ( BWEBB[383:256] ) + ,.AB ( PortBAddr[ADDRWIDTH-2:LSB] ) + ,.DB ( PortBDataIn[383:256] ) + ,.QB ( U_QB[k][383:256] ) + ,.RTSEL ( 2'b00 ) + ,.WTSEL ( 2'b00 ) + ,.PTSEL ( 2'b00 ) + ); + tsdn28hpcpuhdb4096x128m4mw_170a U3_tsdn28hpcpuhdb4096x128m4mw_170a ( + .CLK ( PortClk ) + ,.CEBA ( U_CEBA[k] ) + ,.WEBA ( PortAWriteEnable ) + ,.BWEBA ( BWEBA[511:384] ) + ,.AA ( PortAAddr[ADDRWIDTH-2:LSB] ) + ,.DA ( PortADataIn[511:384] ) + ,.QA ( U_QA[k][511:384] ) + ,.CEBB ( U_CEBB[k] ) + ,.WEBB ( PortBWriteEnable ) + ,.BWEBB ( BWEBB[511:384] ) + ,.AB ( PortBAddr[ADDRWIDTH-2:LSB] ) + ,.DB ( PortBDataIn[511:384] ) + ,.QB ( U_QB[k][511:384] ) + ,.RTSEL ( 2'b00 ) + ,.WTSEL ( 2'b00 ) + ,.PTSEL ( 2'b00 ) + ); + end + always @(posedge PortClk) begin + if(PortAWriteEnable == 1'b1) begin + AA_1D_MSB <= PortAAddr[ADDRWIDTH-1]; + end + else begin + AA_1D_MSB <= AA_1D_MSB; + end + end + always @(posedge PortClk) begin + if(PortBWriteEnable == 1'b1) begin + AB_1D_MSB <= PortBAddr[ADDRWIDTH-1]; + end + else begin + AB_1D_MSB <= AB_1D_MSB; + end + end + assign PortADataOut = {DATAWIDTH{AA_1D_MSB == 1'h0}} & U_QA[0] + | {DATAWIDTH{AA_1D_MSB == 1'h1}} & U_QA[1] + ; + assign PortBDataOut = {DATAWIDTH{AB_1D_MSB == 1'h0}} & U_QB[0] + | {DATAWIDTH{AB_1D_MSB == 1'h1}} & U_QB[1] + ; + end + else begin:dpram_model_generation + dpram_model #( + .DATAWIDTH ( DATAWIDTH ) + ,.ADDRWIDTH ( ADDRWIDTH-LSB ) + ) U_dpram_model ( + .PortClk ( PortClk ) + ,.PortAWriteEnable ( PortAWriteEnable ) + ,.PortAChipEnable ( PortAChipEnable ) + ,.PortAByteWriteEnable ( PortAByteWriteEnable ) + ,.PortAAddr ( PortAAddr[ADDRWIDTH-1:LSB] ) + ,.PortADataIn ( PortADataIn ) + ,.PortADataOut ( PortADataOut ) + ,.PortBWriteEnable ( PortBWriteEnable ) + ,.PortBChipEnable ( PortBChipEnable ) + ,.PortBByteWriteEnable ( PortBByteWriteEnable ) + ,.PortBAddr ( PortBAddr[ADDRWIDTH-1:LSB] ) + ,.PortBDataIn ( PortBDataIn ) + ,.PortBDataOut ( PortBDataOut ) + ); + end +endgenerate +endmodule + + diff --git a/DA4008_V1.2/rtl/memory/xil_tdpram.v b/DA4008_V1.2/rtl/memory/xil_tdpram.v new file mode 100644 index 0000000..40bdbad --- /dev/null +++ b/DA4008_V1.2/rtl/memory/xil_tdpram.v @@ -0,0 +1,156 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 2019/07/03 13:29:31 +// Design Name: +// Module Name: xil_tdpram +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +//`define XINLINX_FPGA + +module xil_tdpram #( + parameter DATAWIDTH = 32 + ,parameter ADDRWIDTH = 12 +)( + input PortClk + ,input [ADDRWIDTH-1 :0] PortAAddr + ,input [DATAWIDTH-1 :0] PortADataIn + ,input PortAWriteEnable //active low + ,input PortAChipEnable //active low + ,input [(DATAWIDTH/8)-1 :0] PortAByteWriteEnable //active low + ,output [DATAWIDTH-1 :0] PortADataOut + + ,input [ADDRWIDTH-1 :0] PortBAddr + ,input [DATAWIDTH-1 :0] PortBDataIn + ,input PortBWriteEnable //active low + ,input PortBChipEnable //active low + ,input [(DATAWIDTH/8)-1 :0] PortBByteWriteEnable //active low + ,output [DATAWIDTH-1 :0] PortBDataOut + ); +//////////////////////////////////////////////////////////////////////////////// +//Function +//////////////////////////////////////////////////////////////////////////////// +function integer clog2(input integer bit_depth); + begin + for(clog2=0;bit_depth>0;clog2=clog2+1) + bit_depth =bit_depth>>1; + end +endfunction + +localparam LSB = clog2(DATAWIDTH/8 -1); +localparam MAW = ADDRWIDTH - LSB; +localparam MB =(DATAWIDTH)*(32'h0000_0001< async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch0_soft_rstn_i +rst_sync ch0_rstn_sync ( + .clk_d ( clk ) + ,.async_rstn ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch0_soft_rstn_i ) + ,.sync_rstn ( ch0_rstn_o ) +); + +//ch1 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch1_soft_rstn_i +rst_sync ch1_rstn_sync ( + .clk_d ( clk ) + ,.async_rstn ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch1_soft_rstn_i ) + ,.sync_rstn ( ch1_rstn_o ) +); + +//ch2 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch2_soft_rstn_i +rst_sync ch2_rstn_sync ( + .clk_d ( clk ) + ,.async_rstn ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch2_soft_rstn_i ) + ,.sync_rstn ( ch2_rstn_o ) +); + +//ch3 reset --> async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch3_soft_rstn_i +rst_sync ch3_rstn_sync ( + .clk_d ( clk ) + ,.async_rstn ( async_rstn_i & por_rstn_i & sys_soft_resetn_i & ch3_soft_rstn_i ) + ,.sync_rstn ( ch3_rstn_o ) +); + +//Phase-locked loop reset -- low active +assign pll_rstn_o = async_rstn_i & por_rstn_i; + +endmodule diff --git a/DA4008_V1.2/rtl/rstgen/rst_sync.v b/DA4008_V1.2/rtl/rstgen/rst_sync.v new file mode 100644 index 0000000..c888918 --- /dev/null +++ b/DA4008_V1.2/rtl/rstgen/rst_sync.v @@ -0,0 +1,29 @@ +`timescale 1ns/1ps +//==================================================== +//Author : pwy +//Date : 2020-06-24 +//Des : async set & sync release +//==================================================== +module rst_sync( +input clk_d , +input async_rstn , +output sync_rstn +); + +reg rstn_s1; +reg rstn_s2; + +always@(posedge clk_d or negedge async_rstn)begin + if(!async_rstn)begin + rstn_s1 <=1'b0; + rstn_s2 <=1'b0; + end + else begin + rstn_s1 <=1'b1; + rstn_s2 <=rstn_s1; + end +end + +assign sync_rstn = rstn_s2; + +endmodule diff --git a/DA4008_V1.2/rtl/spi/spi_bus_decoder.sv b/DA4008_V1.2/rtl/spi/spi_bus_decoder.sv new file mode 100644 index 0000000..2912a49 --- /dev/null +++ b/DA4008_V1.2/rtl/spi/spi_bus_decoder.sv @@ -0,0 +1,91 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : spi_bus_decoder.v +// Department : +// Author : PWY +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 0.1 2024-03-13 PWY Serial Peripheral Interface BUS Decoder +// 0.2 2024-06-15 PWY The slave interface address will be reduced from 25 bits to 20 bits. +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +module spi_bus_decoder #( + parameter SLVNUM = 32 + ,parameter SPIBUS_CMD_REG = 1 + ,parameter SPIBUS_OUT_REG = 1 + )( + input clk + ,input rst_n + ,sram_if.slave mst + ,sram_if.master slv [SLVNUM-1:0] //s and m exchange + ); + + +generate + genvar i; + logic [SLVNUM-1:0] cs_slv; + logic [31 :0] dtemp[SLVNUM-1:0]; + + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.....................................................>>>>>>>>------->LSB +///|<-----------MSB 32 bits-------------------------->||<--Second 32-bit---->||<-------x 32-bit---->||<-------n 32-bit---->| +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +// | 31 || 30:6 || 5:1 || 0 || 31:0 || ...... || 31:0 | +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +// | wnr || addr[24:0] || CHIPID ||resv || data[31:0] || ...... || data[31:0] | +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +//-----------------------------Spi Frame------------------------------------------------------------------------------------- +`timescale 1ns/1ps + +module spi_pll ( + //reset active low + input rst_n + //cfg ID + ,input [4 :0] cfgid //ID number for the entire chip + //SPI interface + ,input csn + ,input sclk + ,input mosi + ,output miso + ,output oen + //SPI Select signal + ,output sel + //regfile interface + ,output [31 :0] wrdata + ,output wren + ,output [7 :0] rwaddr + ,output rden + ,input [31 :0] rddata +); + +wire sel_w ; +wire wnr ; +wire [4 :0] addr_m5b ; +wire [7 :0] addr_l8b ; +//wire [4 :0] chipid ; +wire [5 :0] chipid ; + +wire data_valid ; +//wire [31:0] rddata ;////////////////////////////////////// +//reg rden_reg ;////////////////////////////////////// + +//spi_rstn +wire spi_rstn = rst_n & (~csn); + +////////////////////////////////////////////////////////////////////////// +//bit count +////////////////////////////////////////////////////////////////////////// +wire [4:0] bit_cnt; +//add_cnt +wire add_cnt = ~csn; +//end_cnt +wire end_cnt = add_cnt & (bit_cnt == 5'd31); + + + +wire [4:0] cnt_n = end_cnt ? 5'd0 : + add_cnt ? bit_cnt + 5'b1 : + bit_cnt ; + + +sirv_gnrl_dffr #(5) bit_cnt_dffr (cnt_n, bit_cnt, sclk, spi_rstn); + + +/////////////////////////////////////////////////////////////////////////////// +//Determine whether the current input is an SPI command or data +//Detect the falling edge on the most significant bit of the counter. +//If a falling edge occurs, it indicates that the SPI frame has +//entered the data transmission phase. +/////////////////////////////////////////////////////////////////////////////// +wire bit_cnt_r; +wire bit_cnt_falling = bit_cnt_r & ~bit_cnt[4]; + +sirv_gnrl_dffr #(1) bit_cnt_r_dffr (bit_cnt[4], bit_cnt_r, sclk, spi_rstn); + + +//cmd_or_data:"High" represents data, "low" represents commands +wire cmd_or_data; + +sirv_gnrl_dfflr #(1) cmd_or_data_dfflr (bit_cnt_falling, 1'b1, cmd_or_data, sclk, spi_rstn); + +wire second_falling; + +sirv_gnrl_dfflr #(1) second_falling_dfflr (bit_cnt_falling & cmd_or_data, 1'b1, second_falling, sclk, spi_rstn); + +/////////////////////////////////////////////////////////////////////// +//SPI data sample (Load mosi data) +/////////////////////////////////////////////////////////////////////// + +generate + genvar i; + wire [31:0] recv_vld ; + wire [31:0] mosi_reg ; + for(i=0;i<32;i=i+1) begin: spi_pll_recv + assign recv_vld[i] = add_cnt & (bit_cnt == i ); + sirv_gnrl_dfflr #(1) spi_din_dfflr (recv_vld[i], mosi, mosi_reg[31-i], sclk, spi_rstn); + end +endgenerate + +//addr valid +wire addr_vaild = ~cmd_or_data & add_cnt & (bit_cnt == 5'd26); + +//CMD Update +sirv_gnrl_dfflr #(1) wnr_dfflr (addr_vaild, mosi_reg[31], wnr, sclk, spi_rstn); + +//addr_m5b Update +sirv_gnrl_dfflr #(5) addr_m5b_dfflr (addr_vaild, mosi_reg[30:26], addr_m5b, sclk, spi_rstn); + +//addr_l8b Update +sirv_gnrl_dfflr #(8) addr_l8b_dfflr (addr_vaild, mosi_reg[13:6], addr_l8b, sclk, spi_rstn); + +//chipid Valid +wire chipid_vld = ~cmd_or_data & add_cnt & (bit_cnt == 5'd30); +//chipid Update +sirv_gnrl_dfflrd #(6) chipid_dfflrd (6'b100000, chipid_vld, {1'b0, mosi_reg[5:2],mosi}, chipid, sclk, spi_rstn); + +//sel_w +assign sel_w = (addr_m5b == 5'b11111) & (chipid == {1'b0, cfgid}); + + + +//recv data valid +assign data_valid = cmd_or_data & (bit_cnt == 5'd31); +//assign data_valid = cmd_or_data & (bit_cnt == 5'd31);///////20240514 +//wren +assign wren = data_valid & sel_w & ~wnr; + +//rden +//assign rden = add_cnt & (bit_cnt == 5'd30);///////////////////////// +//assign rden = add_cnt & (bit_cnt == 5'd30) & sel_w;/////////////////////////20240514 +assign rden = add_cnt & (bit_cnt == 5'd30) & wnr;/////////////////////////20240604 + +wire rddata_update; +sirv_gnrl_dffr #(1) rddata_update_dffr (rden, rddata_update, sclk, spi_rstn); + +//wrdata +assign wrdata = {mosi_reg[31:1],mosi}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//Address generation for read and write operations +//The address to be used for updating in the next +//27 clock cycles in the read-write state +/////////////////////////////////////////////////////////////////////////////////////////////////////// + + +wire addr_update = ((wnr & cmd_or_data) | second_falling) & add_cnt & (bit_cnt == 5'd29); +//wire addr_update = cmd_or_data & add_cnt & (bit_cnt == 5'd27); + +wire [7:0] addr_c; + +wire [7:0] addr_n = ~cmd_or_data ? addr_l8b : + addr_update ? addr_c + 8'd4 : + addr_c ; + +sirv_gnrl_dffr #(8) addr_c_dffr (addr_n, addr_c, sclk, spi_rstn); + +assign rwaddr = addr_c; + +//sel +assign sel = sel_w; + +//oen +//assign oen = ~(sel_w & wnr & ~csn); +wire oen_w = ~(sel_w & wnr & ~csn); +//assign oen = oen_w; +sirv_gnrl_dffrs #(1) oen_dffrs (oen_w, oen, sclk, spi_rstn); +//data output +wire[31:0] miso_reg; +wire[31:0] miso_wire; +sirv_gnrl_dfflr #(32) miso_reg_dfflr (rddata_update, rddata, miso_reg, sclk, spi_rstn); +assign miso_wire = miso_reg; + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//SPI send data +/////////////////////////////////////////////////////////////////////////////////////////////////////// +generate + genvar j; + wire [31:0] send_vld ; + wire [31:0] dtemp ; + for(j=0;j<32;j=j+1) begin: spi_pll_send + //assign send_vld[j] = (bit_cnt == ((j==31) ? 0 : (j+1)) ); + assign send_vld[j] = (bit_cnt == j ); + if(j==0) begin: dtemp0 + assign dtemp[j] = (send_vld[j]) ? miso_wire[31-j] : 1'b0; + end + else begin: dtemp1_32 + assign dtemp[j] = (send_vld[j]) ? miso_wire[31-j] : dtemp[j-1]; + end + end +endgenerate + +assign miso = dtemp[31]; + +endmodule + + + + + \ No newline at end of file diff --git a/DA4008_V1.2/rtl/spi/spi_slave.v b/DA4008_V1.2/rtl/spi/spi_slave.v new file mode 100644 index 0000000..32d3097 --- /dev/null +++ b/DA4008_V1.2/rtl/spi/spi_slave.v @@ -0,0 +1,106 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : spi_top.v +// Department : +// Author : pwy +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 1.2 2024-04-02 pwy Integrate a digital module and two SPI modules with PLL +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +module spi_slave ( + //system port + input clk // System Main Clock + ,input rst_n // Spi Reset active low + //spi port + ,input sclk // Spi Clock + ,input csn // Spi Chip Select active low + ,input mosi // Spi Mosi + ,input [4 :0] cfgid + ,output miso // Spi Miso + ,output oen // Spi Miso output enable + //connect pll + ,output [31 :0] pll_wrdata + ,output pll_wren + ,output [7 :0] pll_rwaddr + ,output pll_rden + ,input [31 :0] pll_rddata + //connect system + ,output [31 :0] sys_wrdata + ,output sys_wren + ,output [24 :0] sys_rwaddr + ,output sys_rden + ,input [31 :0] sys_rddata +); + +//////////////////////////////////////////////////////////////// +// pll spi +//////////////////////////////////////////////////////////////// +wire pll_miso ; +wire pll_oen ; +wire pll_sel ; + +spi_pll U_spi_pll ( + .rst_n ( rst_n ) + ,.cfgid ( cfgid ) + ,.csn ( csn ) + ,.sclk ( sclk ) + ,.mosi ( mosi ) + ,.miso ( pll_miso ) + ,.oen ( pll_oen ) + ,.sel ( pll_sel ) + ,.wrdata ( pll_wrdata ) + ,.wren ( pll_wren ) + ,.rwaddr ( pll_rwaddr ) + ,.rden ( pll_rden ) + ,.rddata ( pll_rddata ) +); + +//////////////////////////////////////////////////////////////// +//sys pll +//////////////////////////////////////////////////////////////// +wire sys_miso ; +wire sys_oen ; +spi_sys U_spi_sys ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.cfgid ( cfgid ) + ,.sclk ( sclk ) + ,.csn ( csn ) + ,.mosi ( mosi ) + ,.miso ( sys_miso ) + ,.oen ( sys_oen ) + ,.wrdata ( sys_wrdata ) + ,.addr ( sys_rwaddr ) + ,.wren ( sys_wren ) + ,.rden ( sys_rden ) + ,.rddata ( sys_rddata ) +); + +assign miso = pll_sel ? pll_miso : sys_miso ; +assign oen = pll_sel ? pll_oen : sys_oen ; + +endmodule diff --git a/DA4008_V1.2/rtl/spi/spi_sys.v b/DA4008_V1.2/rtl/spi/spi_sys.v new file mode 100644 index 0000000..2769cdb --- /dev/null +++ b/DA4008_V1.2/rtl/spi/spi_sys.v @@ -0,0 +1,292 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : spi_sys.v +// Department : +// Author : PWY +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 0.1 2024-04-13 PWY SPI BUS for System +// 0.2 2024-06-24 PWY {spi_dout[31:0],1'b0} -> {spi_dout[30:0],1'b0} +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +//-----------------------------Spi Frame------------------------------------------------------------------------------------- +////MSB------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>..............................................>>>>>>>>------->LSB +///|<-----------MSB 32 bits------------------->||<---------Second 32-bit---->||<-------x 32-bit---->||<-------n 32-bit---->| +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +// | 31 || 30:6 || 5:1 || 0 || 31:0 || ...... || 31:0 | +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +// | wnr || addr[24:0] || CHIPID ||resv || data[31:0] || ...... || data[31:0] | +// +-----++----------------------++------------++-----++---------------------++---------------------++---------------------+ +//-----------------------------Spi Frame------------------------------------------------------------------------------------- + + +module spi_sys ( + //system port + input clk // System Main Clock + ,input rst_n // Spi Reset active low + //cfg ID + ,input [4 :0] cfgid //ID number for the entire chip + //spi port + ,input sclk // Spi Clock + ,input csn // Spi Chip Select active low + ,input mosi // Spi Mosi + ,output miso // Spi Miso + ,output oen // Spi Miso output enable + + ,output [31:0] wrdata //write data to sram + ,output [24:0] addr //sram address + ,output wren //write enable sram + ,output rden //rden enable sram + ,input [31:0] rddata //read data from sram + +); + +localparam IDLE = 2'b00, + RECVCMD = 2'b01, + WRITE = 2'b10, + READ = 2'b11; +//----------------------------------------------------------------------- +//SPI module reset processing +//----------------------------------------------------------------------- +//spi_rstn +//wire spi_rstn; +//assign spi_rstn = rst_n & (~csn); + +////////////////////////////////////////////////////////////////////////// +//capture the sck +////////////////////////////////////////////////////////////////////////// +wire [2:0] sclk_reg; +//sync sclk to the main clock using a 3-bits shift register +sirv_gnrl_dffrs #(3) sclk_reg_dffrs ({sclk_reg[1:0],sclk}, sclk_reg, clk, rst_n); + +//sclk's rising edges +wire sclk_p = (sclk_reg[2:1] == 2'b01); + +//sclk's falling edges +//assign sclk_n = (sclk_reg[2:1] == 2'b10); + +////////////////////////////////////////////////////////////////////////// +//capture the csn +////////////////////////////////////////////////////////////////////////// +wire [2:0] csn_reg; +//sync csn to the main clock using a 2-bits shift register + +sirv_gnrl_dffrs #(3) csn_reg_dffrs ({csn_reg[1:0],csn}, csn_reg, clk, rst_n); +// csn is active low +wire csn_active = ~csn_reg[1]; + +//csn's rising edges +wire csn_p = (csn_reg[2:1] == 2'b01); + +//csn's falling edges +wire csn_n = (csn_reg[2:1] == 2'b10); + +////////////////////////////////////////////////////////////////////////// +//capture the mosi +////////////////////////////////////////////////////////////////////////// +wire [1:0] mosi_reg; +//sync mosi to the main clock using a 2-bits shift register + +sirv_gnrl_dffr #(2) mosi_reg_dffr ({mosi_reg[0],mosi}, mosi_reg, clk, rst_n); +//mosi_data +wire mosi_data = mosi_reg[1]; + +////////////////////////////////////////////////////////////////////////// +//cnt +////////////////////////////////////////////////////////////////////////// +wire [4:0] cnt_c; +//add_cnt +wire add_cnt = sclk_p && csn_active; +//end_cnt +wire end_cnt = (add_cnt && (cnt_c == 5'd31)) | csn_p; + +wire [4:0] cnt_n = end_cnt ? 5'h0 : + add_cnt ? cnt_c + 5'b1 : + cnt_c ; + + +sirv_gnrl_dffr #(5) cnt_c_dffr (cnt_n, cnt_c, clk, rst_n); + + +/////////////////////////////////////////////////////////////////////// +//SPI data sample +/////////////////////////////////////////////////////////////////////// + +generate + genvar i; + wire [31:0] recv_vld ; + wire [31:0] spi_din ; + for(i=0;i<32;i=i+1) begin: spi_sys_recv + assign recv_vld[i] = add_cnt & (cnt_c == i ); + sirv_gnrl_dfflr #(1) spi_din_dfflr (recv_vld[i], mosi_data, spi_din[31-i], clk, rst_n); + end +endgenerate + + +wire [1:0] state_c; +wire [1:0] state_n; + + +/////////////////////////////////////////////////////////////////////// +//init_addr capture +/////////////////////////////////////////////////////////////////////// +wire [24:0] initaddr; +wire initaddr_vld = (state_c == RECVCMD ) & add_cnt && (cnt_c == 5'd26); +wire [1:0] initaddr_vld_r; +sirv_gnrl_dffr #(2) initaddr_vld_r_dffr ({initaddr_vld_r[0],initaddr_vld}, initaddr_vld_r, clk, rst_n); + +sirv_gnrl_dfflr #(25) initaddr_dfflr (initaddr_vld_r[0], spi_din[30:6], initaddr, clk, rst_n); + +/////////////////////////////////////////////////////////////////////// +//CMD capture +/////////////////////////////////////////////////////////////////////// +wire cmd ; +sirv_gnrl_dfflr #(1) cmd_dfflr ( initaddr_vld_r[0], spi_din[31], cmd, clk, rst_n); + +/////////////////////////////////////////////////////////////////////// +//CHIPID capture +/////////////////////////////////////////////////////////////////////// +wire [4:0] chipid; +wire [1:0] chipid_vld_r; +wire chipid_vld = (state_c == RECVCMD ) & add_cnt & (cnt_c == 5'd30); +//register cmd_vld to align it with cmd +sirv_gnrl_dffr #(2) chipid_vld_r_dffr ({chipid_vld_r[0],chipid_vld}, chipid_vld_r, clk, rst_n); + +sirv_gnrl_dfflr #(5) chipid_dfflr (chipid_vld_r[0], spi_din[5:1], chipid, clk, rst_n); + +/////////////////////////////////////////////////////////////////////// +//ID matching determination +/////////////////////////////////////////////////////////////////////// +wire chipid_match = (chipid == cfgid); +wire chipid_dismatch = (chipid != cfgid); + + + +/////////////////////////////////////////////////////////////////////// +//SPI Module State Machine +/////////////////////////////////////////////////////////////////////// + +//Generating jump conditions for state machines +wire ilde2recvcmd = (state_c == IDLE ) && csn_active && csn_n ; +wire recvcmd2ilde = (state_c == RECVCMD ) && chipid_dismatch & end_cnt; +wire recvcmd2write = (state_c == RECVCMD ) && chipid_match && ~cmd & end_cnt; +wire recvcmd2read = (state_c == RECVCMD ) && chipid_match && cmd & end_cnt; +wire write2idle = (state_c == WRITE ) && csn_p; +wire read2idle = (state_c == READ ) && csn_p; + +//The first section of the state machine +//state_c +sirv_gnrl_dffr #(2) state_c_dffr (state_n, state_c, clk, rst_n); + +//state_n +assign state_n = ((state_c == IDLE ) && ilde2recvcmd ) ? RECVCMD : + ((state_c == RECVCMD ) && recvcmd2ilde ) ? IDLE : + ((state_c == RECVCMD ) && recvcmd2write ) ? WRITE : + ((state_c == RECVCMD ) && recvcmd2read ) ? READ : + ((state_c == WRITE ) && write2idle ) ? IDLE : + ((state_c == READ ) && read2idle ) ? IDLE : + state_c ; + + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//Address generation for read and write operations +//The address to be used for updating in the next +//27 clock cycles in the read-write state +/////////////////////////////////////////////////////////////////////////////////////////////////////// +wire second_falling; +wire second_falling_w = (state_c == WRITE); +sirv_gnrl_dfflr #(1) second_falling_dfflr (end_cnt ,second_falling_w, second_falling, clk, rst_n); + +wire addr_update = ((state_c == READ) | ((state_c == WRITE) & second_falling)) & add_cnt & (cnt_c == 5'd27); +wire [24:0] addr_c; + +wire [24:0] addr_n = ilde2recvcmd ? 25'd0 : + initaddr_vld_r[1] ? initaddr : + addr_update ? addr_c + 25'd4 : + addr_c ; + +sirv_gnrl_dffr #(25) addr_c_dffr (addr_n, addr_c, clk, rst_n); + +assign addr = addr_c; + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//Write data and write signals generation +/////////////////////////////////////////////////////////////////////////////////////////////////////// +wire wren_r; + +wire wren_w = (state_c == WRITE) & add_cnt & (cnt_c == 5'd31); +//wdata +sirv_gnrl_dfflr #(32) wrdata_dfflr (wren_r, spi_din[31:0], wrdata, clk, rst_n); +//wren_r + +sirv_gnrl_dffr #(1) wren_r_dffr (wren_w, wren_r, clk, rst_n); + +//wren +sirv_gnrl_dffr #(1) wren_dffr (wren_r, wren, clk, rst_n); + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//read signals generation +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +wire rden_w = chipid_match & cmd & add_cnt & (cnt_c == 5'd28); +sirv_gnrl_dffr #(1) rden_dffr (rden_w, rden, clk, rst_n); + +//Read data register +wire rddata_vld = cmd & add_cnt & (cnt_c == 5'd30); +wire [31:0] rddata_reg; +sirv_gnrl_dfflr #(32) rddata_reg_dfflr (rddata_vld, rddata[31:0], rddata_reg, clk, rst_n); + + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//SPI send data update +/////////////////////////////////////////////////////////////////////////////////////////////////////// +wire [31:0] spi_dout ; +wire update_flag = cmd & add_cnt & (cnt_c == 5'd31); + +wire [31:0] rddata_sr = update_flag ? rddata_reg[31:0] : + ((state_c == READ) & add_cnt) ? {spi_dout[30:0],1'b0} : //M 2024-06-24 + spi_dout ; + +sirv_gnrl_dffr #(32) spi_dout_dffr (rddata_sr, spi_dout, clk, rst_n); + + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//SPI send data +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +assign miso = spi_dout[31]; + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +//SPI output enable +/////////////////////////////////////////////////////////////////////////////////////////////////////// +sirv_gnrl_dffrs #(1) oen_dffr (~(state_c == READ), oen, clk, rst_n); + +endmodule + + diff --git a/DA4008_V1.2/rtl/systemregfile/systemregfile.v b/DA4008_V1.2/rtl/systemregfile/systemregfile.v new file mode 100644 index 0000000..6c104e9 --- /dev/null +++ b/DA4008_V1.2/rtl/systemregfile/systemregfile.v @@ -0,0 +1,716 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : ssytem_regfile.v +// Department : +// Author : PWY +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 1.0 2026-03-01 PWY +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +// ----------------------------------------------------------- +// -- Register address offset macros +// ----------------------------------------------------------- +//Identity Register +`define IDR 16'h00 +//Vendor Code Register +`define VIDR 16'h04 +//RTL Freeze Date Register +`define DATER 16'h08 +//Version Register +`define VERR 16'h0C +//Wirte And Read Test Register +`define TESTR 16'h10 +//Status Register +`define ISR 16'h14 +//Soft Reset Time Register +`define SFRTR 16'h18 +//Soft Reset Register +`define SFRR 16'h1C +//Sync Cntrl Register +`define SYNCR 16'h20 +//Ramp Ctrl Register +`define RAMPCTR 16'h24 +//Ramp IFS Register +`define RAMPIFSR 16'h28 +//Data Out Select Register +`define DOSELR 16'h2C +//Lvds Force Train Register +`define LVDSFTR 16'h30 +//Lvds Tap Force Register +`define LVDSTFR 16'h34 +//Lvds Tap Step Register +`define LVDSTSR 16'h38 +//Lvds Train Threshold Register +`define LVDSTHR 16'h3C +//Lvds Tap Adj Mask Register +`define LVDSTAMR 16'h40 +//Lvds Descram Enable Register +`define LVDSDSER 16'h44 +//Lvds Train Always On Register +`define LVDSTAOR 16'h48 +//Lvds Status Register +`define LVDSSR 16'h4C +//Lvds Frame Success Count Register +`define LVDSFSCR 16'h50 +//Lvds CRC Error Count Register +`define LVDSCECR 16'h54 +//Lvds Frame Status Register +`define LVDSFSTR 16'h58 +//Lvds Train Status Register +`define LVDSTSTR 16'h5C + +//Interrupt Mask Register +//[31 :6] --> Reserved +//[5 ] --> crc_error Interrupt Mask +//[4 ] --> phase_adj_req Interrupt Mask +//[3 ] --> train_ready Interrupt Mask +//[2 ] --> link_down Interrupt Mask +//[1 ] --> cmd_fifo_empty Interrupt Mask +//[0 ] --> cmd_fifo_full Interrupt Mask +`define IMR 16'h60 + +//Interrupt Mask Register +//[31 :6] --> Reserved +//[5 ] --> crc_error Masked Interrupt Status +//[4 ] --> phase_adj_req Masked Interrupt Status +//[3 ] --> train_ready Masked Interrupt Status +//[2 ] --> link_down Masked Interrupt Status +//[1 ] --> cmd_fifo_empty Masked Interrupt Status +//[0 ] --> cmd_fifo_full Masked Interrupt Status +`define MISR 16'h64 + +module systemregfile # ( + parameter CHIPCODE = 32'hDA400801 // 32'hDA400801:DA4008-01 + ,parameter MFDATE = 32'h20260510 // The production date is May 10, 2026 + )( + //system port + input clk // System Main Clock + ,input rst_n // Spi Reset active low + //rw op port + ,input [31 :0] wrdata // write data + ,input wren // write enable + ,input [15 :0] rwaddr // read & write address + ,input rden // read enable + ,output [31 :0] rddata // read data + //irq + ,output irq + //Status input + ,input cmd_fifo_full + ,input cmd_fifo_empty + ,input [2 :0] awg_status + ,input awg_busy + //Soft Reset out + ,output sys_soft_rstn + //Data Out Select port + ,output [0 :0] dout_sel //1'b0: Sram Data; 1'b1: Ramp Data; + //SYNC Ctrl + ,output [15 :0] sync_delay + ,output int_sync + ,output int_sync_en + ,output sync_oen + //Ramp Cntrl Signals + ,output ramp_en //ramp_en = dout_sel[0]; + ,output [31 :0] ramp_ifs + ,output [7 :0] ramp_step + ,output ramp_fixed + ,output [7 :0] ramp_fixed_value + //LVDS + ,output force_train + ,output tap_force + ,output [2 :0] tap_step + ,output [2 :0] tap_adj_mask + ,output [19 :0] train_threshold + ,output descram_en + ,output always_on + ,input link_down + ,input train_ready + ,input crc_error + ,input phase_adj_req + ,input [2 :0] phase_tap + ,input [31 :0] frame_success_cnt + ,input [31 :0] crc_err_cnt + ,input prefilling + ,input [31 :0] train_status + ,input [31 :0] frame_status +); + +localparam L = 1'b0, + H = 1'b1; + +localparam IDRD = CHIPCODE; +localparam VIDRD = 32'h58445500; +localparam DATERD = MFDATE; +localparam VERSION = 32'h00000001; +localparam TESTRD = 32'h01234567; +// ------------------------------------------------------ +// -- Register enable (select) wires +// ------------------------------------------------------ +wire idren ; // IDR select +wire vidren ; // VIDR select +wire dateren ; // DATER select +wire verren ; // VERR select +wire testren ; // TESTR select +wire isren ; // ISR select +wire sfrtren ; // MISR select +wire sfrren ; // SFRTR select +wire syncren ; // SFRR select +wire rampctren ; // RAMPCTR select +wire rampifsren ; // RAMPIFSR select +wire doselren ; // DOSELR select +wire lvdsftren ; // LVDSFTR select +wire lvdstfren ; // LVDSTFR select +wire lvdstsren ; // LVDSTSR select +wire lvdsthren ; // LVDSTHR select +wire lvdssren ; // LVDSSR select +wire lvdsfcsren ; // LVDSFSCR select +wire lvdscecren ; // LVDSCECR select +wire lvdstamren ; // LVDSTAMR select +wire lvdsdseren ; // LVDSDSER select +wire lvdstaoren ; // LVDSTAOR select +wire lvdsfstren ; // LVDSFSTR select +wire lvdststren ; // LVDSTSTR select +wire imren ; // IMR select +wire misren ; // MISR select +// ------------------------------------------------------ +// -- Register write enable wires +// ------------------------------------------------------ +wire testrwe ; // testr write enable +wire sfrtrwe ; // sfrtr write enable +wire sfrrwe ; // sfrr write enable +wire syncrwe ; // syncr write enable +wire rampctrwe ; // RAMPCTR write enable +wire rampifsrwe ; // RAMPIFSR write enable +wire doselrwe ; // DOSELR write enable +wire lvdsftrwe ; // LVDSFTR write enable +wire lvdsatrwe ; // LVDSATR write enable +wire lvdstsrwe ; // LVDSTSR write enable +wire lvdsthrwe ; // LVDSTHR write enable +wire lvdsdserwe ; // LVDSDSER write enable +wire lvdstaorwe ; // LVDSTAOR write enable +wire imrwe ; // IMR write enable +// ------------------------------------------------------ +// -- Misc wires +// ------------------------------------------------------ +wire [5 :0] irisr ; // original status wire + +// ------------------------------------------------------ +// -- Misc Registers +// ------------------------------------------------------ +wire [31 :0] testr ; +wire [5 :0] isr ; +wire [31 :0] sfrtr ; +wire [0 :0] sfrr ; +wire [18 :0] syncr ; +wire [23 :0] rampctr ; +wire [31 :0] rampifsr ; +wire [0 :0] doselr ; + +wire [0 :0] lvdsftr ; +wire [0 :0] lvdsatr ; +wire [2 :0] lvdstsr ; +wire [19 :0] lvdsthr ; +wire [7 :0] lvdssr ; +wire [31 :0] lvdsfcsr ; +wire [31 :0] lvdscecr ; +wire [2 :0] lvdstamr ; +wire [0 :0] lvdsdser ; +wire [0 :0] lvdstaor ; +wire [31 :0] lvdsfstr ; +wire [31 :0] lvdststr ; +wire [5 :0] imr ; +wire [5 :0] misr ; + +reg [31 :0] rddata_reg ; + +// ------------------------------------------------------ +// -- Address decoder +// +// Decodes the register address offset input(reg_addr) +// to produce enable (select) signals for each of the +// SW-registers in the macrocell. The reg_addr input +// is bits [8:0] of the paddr bus. +// ------------------------------------------------------ +assign idren = (rwaddr[15:2] == `IDR >> 2) ? 1'b1 : 1'b0; +assign vidren = (rwaddr[15:2] == `VIDR >> 2) ? 1'b1 : 1'b0; +assign dateren = (rwaddr[15:2] == `DATER >> 2) ? 1'b1 : 1'b0; +assign verren = (rwaddr[15:2] == `VERR >> 2) ? 1'b1 : 1'b0; +assign testren = (rwaddr[15:2] == `TESTR >> 2) ? 1'b1 : 1'b0; +assign isren = (rwaddr[15:2] == `ISR >> 2) ? 1'b1 : 1'b0; +assign sfrtren = (rwaddr[15:2] == `SFRTR >> 2) ? 1'b1 : 1'b0; +assign sfrren = (rwaddr[15:2] == `SFRR >> 2) ? 1'b1 : 1'b0; +assign syncren = (rwaddr[15:2] == `SYNCR >> 2) ? 1'b1 : 1'b0; +assign rampctren = (rwaddr[15:2] == `RAMPCTR >> 2) ? 1'b1 : 1'b0; +assign rampifsren = (rwaddr[15:2] == `RAMPIFSR >> 2) ? 1'b1 : 1'b0; +assign doselren = (rwaddr[15:2] == `DOSELR >> 2) ? 1'b1 : 1'b0; +assign lvdsftren = (rwaddr[15:2] == `LVDSFTR >> 2) ? 1'b1 : 1'b0; +assign lvdstfren = (rwaddr[15:2] == `LVDSTFR >> 2) ? 1'b1 : 1'b0; +assign lvdstsren = (rwaddr[15:2] == `LVDSTSR >> 2) ? 1'b1 : 1'b0; +assign lvdsthren = (rwaddr[15:2] == `LVDSTHR >> 2) ? 1'b1 : 1'b0; +assign lvdssren = (rwaddr[15:2] == `LVDSSR >> 2) ? 1'b1 : 1'b0; +assign lvdsfcsren = (rwaddr[15:2] == `LVDSFSCR >> 2) ? 1'b1 : 1'b0; +assign lvdscecren = (rwaddr[15:2] == `LVDSCECR >> 2) ? 1'b1 : 1'b0; +assign lvdstamren = (rwaddr[15:2] == `LVDSTAMR >> 2) ? 1'b1 : 1'b0; +assign lvdsdseren = (rwaddr[15:2] == `LVDSDSER >> 2) ? 1'b1 : 1'b0; +assign lvdstaoren = (rwaddr[15:2] == `LVDSTAOR >> 2) ? 1'b1 : 1'b0; +assign lvdsfstren = (rwaddr[15:2] == `LVDSFSTR >> 2) ? 1'b1 : 1'b0; +assign lvdststren = (rwaddr[15:2] == `LVDSTSTR >> 2) ? 1'b1 : 1'b0; +assign imren = (rwaddr[15:2] == `IMR >> 2) ? 1'b1 : 1'b0; +assign misren = (rwaddr[15:2] == `MISR >> 2) ? 1'b1 : 1'b0; +// ------------------------------------------------------ +// -- Write enable signals +// +// Write enable signals for writable SW-registers. +// The write enable for each register is the ANDed +// result of the register enable and the input reg_wren +// ------------------------------------------------------ +assign testrwe = testren & wren; +assign sfrtrwe = sfrtren & wren; +assign sfrrwe = sfrren & wren; +assign syncrwe = syncren & wren; +assign rampctrwe = rampctren & wren; +assign rampifsrwe = rampifsren & wren; +assign doselrwe = doselren & wren; +assign lvdsftrwe = lvdsftren & wren; +assign lvdstfrwe = lvdstfren & wren; +assign vdstsrwe = lvdstsren & wren; +assign lvdsthrwe = lvdsthren & wren; +assign lvdstamrwe = lvdstamren & wren; +assign lvdsdserwe = lvdstamren & wren; + +assign imrwe = imren & wren; + +// ------------------------------------------------------ +// -- testr Register +// +// Write testr for 'TESTR' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> testr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) testr_dfflrd (TESTRD, testrwe, wrdata[31:0], testr, clk, rst_n); + + +// ------------------------------------------------------ +// -- Soft Reset Count Register +// +// Write Soft Reset Count for 'sfrtcr' : 6-bit register +// Register is split into the following bit fields +// +// [31:0] --> sfrtcr,default value 32'd300 +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(32) sfrtr_dfflrd (32'd1, sfrtrwe, wrdata[31:0], sfrtr, clk, rst_n);/////////////////////////////sfrtcr-->sfrtr + + +// ------------------------------------------------------ +// -- SYNC Contrl Register +// +// +// [17 ] --> sync_oen ,default value 1'b0 +// [17 ] --> int_sync_en,default value 1'b0 +// [16 ] --> int_sync ,default value 1'b0 +// [15:0] --> sync_delay ,default value 16'd0 +// ------------------------------------------------------ +//sirv_gnrl_dfflr #(18) syncr_dfflr (syncrwe, wrdata[17:0], syncr, clk, rst_n); +// sirv_gnrl_dfflr #(17) syncr_dfflr (syncrwe, {syncrwe,wrdata[15:0]}, syncr, clk, rst_n); //pwy-20250808 +sirv_gnrl_dfflrd #(16) syncr_dfflrd (16'd1, syncrwe, wrdata[15:0], syncr[15:0], clk, rst_n); //pwy-20250808 +sirv_gnrl_dffr #(1) syncr16_dffr (syncrwe & wrdata[16], syncr[16], clk, rst_n); //pwy-20250808 +sirv_gnrl_dfflrd #(1) syncr16_dfflrd (1'b1, syncrwe, wrdata[17], syncr[17], clk, rst_n); //pwy-20250808 +sirv_gnrl_dfflrd #(1) sync_oen_dfflrd (1'b0, syncrwe, wrdata[18], syncr[18], clk, rst_n); //pwy-20260303 +// ------------------------------------------------------ +// -- rampctr register +// +// Write rampctr for 'RAMPCTR' : 24-bit register +// Register is split into the following bit fields +// +// [23:0] --> rampctr +// ------------------------------------------------------ +sirv_gnrl_dfflr #(24) rampctr_dfflrs (rampctrwe, wrdata[23:0], rampctr, clk, rst_n); + +// ------------------------------------------------------ +// -- rampifsr register +// +// Write rampifsr for 'rampifsr' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> ramp_ifs +// ------------------------------------------------------ +sirv_gnrl_dfflr #(32) ramp_ifs_dfflrs (rampifsrwe, wrdata[31:0], rampifsr, clk, rst_n); + +// ------------------------------------------------------ +// -- doselr register +// +// Write doselr for 'DOSELR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> doselr +// ------------------------------------------------------ +sirv_gnrl_dfflr #(1) doselr_dfflrs (doselrwe, wrdata[0], doselr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdsftr Register +// +// Write lvdsftr for 'LVDSFTR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> lvdsftr +// ------------------------------------------------------ +sirv_gnrl_dffr #(1) lvdsftr_dffr (lvdsftrwe & wrdata[0], lvdsftr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdstfr register +// +// Write lvdstfr for 'LVDSTFR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> lvdstfr +// ------------------------------------------------------ +sirv_gnrl_dfflr #(1) lvdstfr_dfflrs (lvdstfrwe, wrdata[0], lvdstfr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdstsr register +// +// Write lvdstsr for 'LVDSTSR' : 1-bit register +// Register is split into the following bit fields +// +// [2:0] --> lvdstsr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(3) lvdstsr_dfflrd (3'd1, lvdstsrwe, wrdata[2:0], lvdstsr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdsthr register +// +// Write lvdsthr for 'LVDSTHR' : 20-bit register +// Register is split into the following bit fields +// +// [19:0] --> lvdsthr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(20) lvdsthr_dfflrd (20'd100, lvdsthrwe, wrdata[19:0], lvdsthr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdstamr register +// +// Write lvdsfcsr for 'LVDSTAMR' : 3-bit register +// Register is split into the following bit fields +// +// [2:0] --> lvdstamr +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(3) lvdstamr_dfflrd (3'b111, lvdstamrwe, wrdata[2:0], lvdstamr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdsdser register +// +// Write lvdsfcsr for 'LVDSDSER' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> lvdsdser +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(1) lvdsdser_dfflrd (1'b1, lvdsdserwe, wrdata[0], lvdsdser, clk, rst_n); + + +// ------------------------------------------------------ +// -- lvdstaor register +// +// Write lvdstaor for 'LVDSTAOR' : 1-bit register +// Register is split into the following bit fields +// +// [0:0] --> lvdstaor +// ------------------------------------------------------ +sirv_gnrl_dfflrd #(1) lvdstaor_dfflrd (1'b1, lvdstaorwe, wrdata[0], lvdstaor, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdssr register +// +// Write lvdssr for 'LVDSSR' : 8-bit register +// Register is split into the following bit fields +// +// [7:0] --> lvdssr +// ------------------------------------------------------ +sirv_gnrl_dffr #(8) llvdssr_dffr ({ link_down ,train_ready ,crc_error , + phase_adj_req ,phase_tap[2:0] , + prefilling }, lvdssr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdsfcsr register +// +// Write lvdsfcsr for 'LVDSFSCR' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> lvdsfcsr +// ------------------------------------------------------ +sirv_gnrl_dffr #(32) lvdsfcsr_dffr (frame_success_cnt, lvdsfcsr, clk, rst_n); + + +// ------------------------------------------------------ +// -- lvdscecr register +// +// Write lvdscecr for 'LVDSCECR' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> lvdscecr +// ------------------------------------------------------ +sirv_gnrl_dffr #(32) lvdscecr_dffr (crc_err_cnt, lvdscecr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdsfstr register +// +// Write lvdsfstr for 'LVDSFSR' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> lvdsfstr +// ------------------------------------------------------ +sirv_gnrl_dffr #(32) lvdsfstr_dffr (frame_status, lvdsfstr, clk, rst_n); + +// ------------------------------------------------------ +// -- lvdststr register +// +// Write lvdststr for 'LVDTFSR' : 32-bit register +// Register is split into the following bit fields +// +// [31:0] --> lvdststr +// ------------------------------------------------------ +sirv_gnrl_dffr #(32) lvdststr_dffr (train_status, lvdststr, clk, rst_n); + +// --------------------------------------------------------------------------------------------------- +// -- interrupt Mask Register +// +// Write interrupt Mask for 'imr' : 6-bit register +// Register is split into the following bit fields +// +//Interrupt Mask Register +//[31 :6] --> Reserved +//[5 ] --> crc_error Interrupt Mask +//[4 ] --> phase_adj_req Interrupt Mask +//[3 ] --> train_ready Interrupt Mask +//[2 ] --> link_down Interrupt Mask +//[1 ] --> cmd_fifo_empty Interrupt Mask +//[0 ] --> cmd_fifo_full Interrupt Mask +// --------------------------------------------------------------------------------------------------- +sirv_gnrl_dfflr #(6) imr_dfflr (imrwe, wrdata[5:0], imr, clk, rst_n); + +// ------------------------------------------------------ +// -- soft reset count +// ------------------------------------------------------ + +wire [31:0] cnt_c; +wire sys_soft_rstn_r; +wire add_cnt = (sys_soft_rstn_r == L) ; + +wire end_cnt = add_cnt & (cnt_c == sfrtr-1); + +wire [31:0] cnt_n = end_cnt ? 32'h0 : + add_cnt ? cnt_c + 1'b1 : + cnt_c ; + + +sirv_gnrl_dffr #(32) cnt_c_dffr (cnt_n, cnt_c, clk, rst_n); + +// ------------------------------------------------------ +// -- Soft Reset Register +// +// Write Soft Reset for 'sfrtr' : 1-bit register +// Register is split into the following bit fields +// +// [16'h001C] --> System Soft Reset ,low active +// ------------------------------------------------------ + +//sys_soft_rstn_r +wire sys_soft_rstn_en = end_cnt | sfrrwe; +wire sys_soft_rstn_w = end_cnt ? 1'b1 : + sfrrwe ? 1'b0 : + 1'b1 ; +sirv_gnrl_dfflrs #(1) sys_soft_rstn_r_dffls (sys_soft_rstn_en, sys_soft_rstn_w, sys_soft_rstn_r, clk, rst_n); + +assign sys_soft_rstn = sys_soft_rstn_r; + + +// ------------------------------------------------------ +// -- Read data mux +// +// -- The data from the selected register is +// -- placed on a zero-padded 32-bit read data bus. +// ------------------------------------------------------ +always @(*) begin : RDDATA_PROC + rddata_reg = {32{1'b0}}; + if(idren == H) rddata_reg[31:0] = IDRD ; + if(vidren == H) rddata_reg[31:0] = VIDRD ; + if(dateren == H) rddata_reg[31:0] = DATERD ; + if(verren == H) rddata_reg[31:0] = VERSION ; + if(testren == H) rddata_reg[31:0] = testr ; + if(isren == H) rddata_reg[31:0] = isr ; + if(sfrtren == H) rddata_reg[31:0] = sfrtr ; + if(syncren == H) rddata_reg[18:0] = syncr ; + if(rampctren == H) rddata_reg[23:0] = rampctr ; + if(rampifsren == H) rddata_reg[31:0] = rampifsr ; + if(doselren == H) rddata_reg[0 :0] = doselr ; + if(lvdsftren == H) rddata_reg[0 :0] = lvdsftr ; + if(lvdstfren == H) rddata_reg[0 :0] = lvdstfr ; + if(lvdstsren == H) rddata_reg[2 :0] = lvdstsr ; + if(lvdsthren == H) rddata_reg[19:0] = lvdsthr ; + if(lvdssren == H) rddata_reg[7 :0] = lvdssr ; + if(lvdstamren == H) rddata_reg[2 :0] = lvdstamr ; + if(lvdsfcsren == H) rddata_reg[31:0] = lvdsfcsr ; + if(lvdscecren == H) rddata_reg[31:0] = lvdscecr ; + if(lvdsdseren == H) rddata_reg[0 :0] = lvdsdser ; + if(lvdstaoren == H) rddata_reg[0 :0] = lvdstaor ; + if(lvdsfstren == H) rddata_reg[31:0] = lvdsfstr ; + if(lvdststren == H) rddata_reg[31:0] = lvdststr ; + if(imren == H) rddata_reg[5 :0] = imr ; + if(misren == H) rddata_reg[5 :0] = misr ; +end + +//rddata +sirv_gnrl_dfflr #(32) rddata_dfflr (rden, rddata_reg, rddata, clk, rst_n); + +// ------------------------------------------------------ +// -- status +// ------------------------------------------------------ +//read misr clear interrupts +wire icr = (misren) && rden; + +//train_ready +wire train_ready_r; +wire train_ready_en = icr | train_ready; +wire train_ready_w = ~icr | train_ready; +sirv_gnrl_dfflr #(1) train_ready_r_dfflr (train_ready_en, train_ready_w, train_ready_r, clk, rst_n); + +//crc_error +wire crc_error_r; +wire crc_error_en = icr | crc_error; +wire crc_error_w = ~icr | crc_error; +sirv_gnrl_dfflr #(1) crc_error_r_dfflr (crc_error_en, crc_error_w, crc_error_r, clk, rst_n); + +//phase_adj_req +wire phase_adj_req_r; +wire phase_adj_req_en = icr | phase_adj_req; +wire phase_adj_req_w = ~icr | phase_adj_req; +sirv_gnrl_dfflr #(1) cphase_adj_req_r_dfflr (phase_adj_req_en, phase_adj_req_w, phase_adj_req_r, clk, rst_n); + +//link_down +wire link_down_r; +wire link_down_en = icr | link_down; +wire link_down_w = ~icr | link_down; +sirv_gnrl_dfflr #(1) link_down_r_dfflr (link_down_en, link_down_w, link_down_r, clk, rst_n); + +//cmd_fifo_full +wire cmd_fifo_full_r; +wire cmd_fifo_full_en = icr | cmd_fifo_full; +wire cmd_fifo_full_w = ~icr | cmd_fifo_full; +sirv_gnrl_dfflr #(1) cmd_fifo_full_r_dfflr (cmd_fifo_full_en, cmd_fifo_full_w, cmd_fifo_full_r, clk, rst_n); + +//cmd_fifo_empty +wire cmd_fifo_empty_r; +wire cmd_fifo_empty_en = icr | cmd_fifo_empty; +wire cmd_fifo_empty_w = ~icr | cmd_fifo_empty; +sirv_gnrl_dfflr #(1) cmd_fifo_empty_r_dfflr (cmd_fifo_empty_en, cmd_fifo_empty_w, cmd_fifo_empty_r, clk, rst_n); + +//irisr +//Interrupt Status Register +//[31 :6] --> Reserved +//[5 ] --> crc_error Interrupt Status +//[4 ] --> phase_adj_req Interrupt Status +//[3 ] --> train_ready Interrupt Status +//[2 ] --> link_down Interrupt Status +//[1 ] --> cmd_fifo_empty Interrupt Status +//[0 ] --> cmd_fifo_full Interrupt Status + +assign irisr[5 ] = crc_error_r ; +assign irisr[4 ] = phase_adj_req_r ; +assign irisr[3 ] = train_ready_r ; +assign irisr[2 ] = link_down_r ; +assign irisr[1 ] = cmd_fifo_full_r ; +assign irisr[0 ] = cmd_fifo_empty_r ; + +// ------------------------------------------------------ +// -- Interrupt Status Register - Read Only +// +// This register contains the status of all +// DA4008 Chip interrupts after masking. +// ------------------------------------------------------ +sirv_gnrl_dffr #(6) isr_dffr (irisr, isr, clk, rst_n); + +//misr +wire[5:0] misr_w = imr & irisr; +sirv_gnrl_dffr #(6) misr_dffr (misr_w, misr, clk, rst_n); + +//irq +wire irq_w = |misr; +sirv_gnrl_dffr #(1) irq_dffr (irq_w, irq, clk, rst_n); + + +//sync ctrl +assign sync_oen = syncr[18 ] ; +assign int_sync_en = syncr[17 ] ; +assign int_sync = syncr[16 ] ; +assign sync_delay = syncr[15:0] ; + +//Ramp & Data Select +//Data Select +assign dout_sel = doselr ; +//RAMP cfg +assign ramp_en = doselr ; +assign ramp_step = rampctr[23:16] ; +assign ramp_fixed_value = rampctr[15:8] ; +assign ramp_fixed = rampctr[0] ; +assign ramp_ifs = rampifsr ; + +//LVDS +assign force_train = lvdsftr ; +assign tap_force = lvdstfr ; +assign tap_step = lvdstsr ; +assign tap_adj_mask = lvdstamr; +assign train_threshold = lvdsthr ; +assign descram_en = lvdsdser; +assign always_on = lvdstaor; + +endmodule + +`undef IDR +`undef VIDR +`undef DATER +`undef VERR +`undef TESTR +`undef ISR +`undef MISR +`undef SFRTR +`undef SFRR +`undef RAMPCTR +`undef RAMPIFSR +`undef DOSELR +`undef LVDSFTR +`undef LVDSTFR +`undef LVDSTSR +`undef LVDSTHR +`undef LVDSSR +`undef LVDSFSCR +`undef LVDSCECR +`undef LVDSTAMR +`undef LVDSDSER +`undef LVDSTAOR +`undef LVDSFSTR +`undef LVDSTSTR +`undef IMR +`undef MISR diff --git a/DA4008_V1.2/rtl/top/da4008_chip_top.sv b/DA4008_V1.2/rtl/top/da4008_chip_top.sv new file mode 100644 index 0000000..d5c92c4 --- /dev/null +++ b/DA4008_V1.2/rtl/top/da4008_chip_top.sv @@ -0,0 +1,212 @@ + + +`include "../define/chip_define.v" +module da4008_chip_top ( + //spi port + input PI_sclk // Spi Clock + ,input PI_csn // Spi Chip Select active low + ,input PI_mosi // Spi Mosi + ,output PO_miso // Spi Miso + //irq + ,output PO_irq + //system port + ,input PI_async_rstn + ,input PI_sync_in + ,output PO_sync_out + + ,input clk + //lvds rx + ,input [3 :0] lvds_data + ,input [0 :0] lvds_valid + ,input [0 :0] lvds_clk + ,output [2 :0] phase_tap + //DAC Data + ,output [6 :0] MSB_OUT [63:0] + ,output [4 :0] LSB_OUT [63:0] + ,output MSB_DUM [63:0] + ,output DEM_VLD + //DAC Cfg Port + ,output [3 :0] Rterm + ,output [2 :0] CasAddr + ,output [2 :0] CasDw + ,output [9 :0] IMainCtrl + ,output [3 :0] IBleedCtrl + ,output [3 :0] ICkCml + ,output [31 :0] CurRsv0 + ,output [31 :0] CurRsv1 + //CLK Cfg Port + ,output [0 :0] CcalRstn + ,output [3 :0] EnAllP + ,output [0 :0] DccEn + ,output [0 :0] CasGateCkCtrl + ,output [0 :0] SpiEnPi + ,output [0 :0] SpiEnQec + ,output [0 :0] SpiEnDcc + ,output [4 :0] SpiQecCtrlIp + ,output [4 :0] SpiQecCtrlIn + ,output [4 :0] SpiQecCtrlQp + ,output [4 :0] SpiQecCtrlQn + ,output [5 :0] SpiDccCtrlIup + ,output [5 :0] SpiDccCtrlIdn + ,output [5 :0] SpiDccCtrlQup + ,output [5 :0] SpiDccCtrlQdn + ,output [7 :0] SpiSiqNOut + ,output [7 :0] SpiSiqPOut + ,output [3 :0] SpiSiPOut + ,output [3 :0] SpiSqPOut + ,output [2 :0] CrtlCrossOverN + ,output [2 :0] CrtlCrossOverP + ,output [31 :0] CcalRsv0 + ,output [31 :0] CcalRsv1 + ,output [3 :0] SelCk10GDig + ,output [3 :0] SelCk2p5GDig + ,output [8 :0] SelCk625MDig + ,output [15 :0] P2sDataEn + ,output [15 :0] P2sEnAllP + ,output [15 :0] EnPiP + ,output [15 :0] CkDivRstn + ,output [31 :0] p2srsv0 + ,output [31 :0] p2srsv1 + ,output [15 :0] CkRxSw + ,output [15 :0] RstnCk + ,output [15 :0] CtrlZin +); + +//------------------------------iopad instantiation start-------------------------------------- +// iopad +//--------------------------------------------------------------------------------------------- +wire async_rstn ; +wire sync_in ; +wire sync_out ; +wire sclk ; +wire csn ; +wire mosi ; +wire miso ; +wire oen ; +wire irq ; + + +iopad U_iopad ( + //+++++++++++++++++++++++++++++++++++++++++++++// + // PAD Strat // + //+++++++++++++++++++++++++++++++++++++++++++++// + .PI_async_rstn ( PI_async_rstn ) + ,.PI_sync_in ( PI_sync_in ) + ,.PO_sync_out ( PO_sync_out ) + ,.PI_sclk ( PI_sclk ) + ,.PI_csn ( PI_csn ) + ,.PI_mosi ( PI_mosi ) + ,.PO_miso ( PO_miso ) + ,.PO_irq ( PO_irq ) + //+++++++++++++++++++++++++++++++++++++++++++++// + // PAD End // + //+++++++++++++++++++++++++++++++++++++++++++++// + + //+++++++++++++++++++++++++++++++++++++++++++++// + // Internal signal Start // + //+++++++++++++++++++++++++++++++++++++++++++++// + ,.async_rstn ( async_rstn ) + ,.sync_in ( sync_in ) + ,.sync_out ( sync_out ) + ,.sclk ( sclk ) + ,.csn ( csn ) + ,.mosi ( mosi ) + ,.miso ( miso ) + ,.oen ( oen ) + ,.irq_n ( ~irq ) +); + + +//------------------------------spi_slave instantiation start---------------------------------- +// spi_slave +//--------------------------------------------------------------------------------------------- + +wire [7 :0] wave_data_out [63:0] ; +wire wave_data_valid ; +wire [14 :0] Set [63:0] ; +wire PrbsEn ; +digital_top digital_top ( + .clk ( clk ) + ,.rst_n ( async_rstn ) + ,.sync_in ( sync_in ) + ,.sync_out ( sync_out ) + ,.cfgid ( 5'b00000 ) + ,.sclk ( sclk ) + ,.csn ( csn ) + ,.mosi ( mosi ) + ,.miso ( miso ) + ,.oen ( oen ) + ,.irq ( irq ) + ,.wave_data_out ( wave_data_out ) + ,.wave_data_valid ( wave_data_valid ) + ,.lvds_data ( lvds_data ) + ,.lvds_valid ( lvds_valid ) + ,.lvds_clk ( lvds_clk ) + ,.phase_tap ( phase_tap ) + ,.Rterm ( Rterm ) + ,.PrbsEn ( PrbsEn ) + ,.Set ( Set ) + ,.CasAddr ( CasAddr ) + ,.CasDw ( CasDw ) + ,.IMainCtrl ( IMainCtrl ) + ,.IBleedCtrl ( IBleedCtrl ) + ,.ICkCml ( ICkCml ) + ,.CurRsv0 ( CurRsv0 ) + ,.CurRsv1 ( CurRsv1 ) + ,.CcalRstn ( CcalRstn ) + ,.EnAllP ( EnAllP ) + ,.DccEn ( DccEn ) + ,.CasGateCkCtrl ( CasGateCkCtrl ) + ,.SpiEnPi ( SpiEnPi ) + ,.SpiEnQec ( SpiEnQec ) + ,.SpiEnDcc ( SpiEnDcc ) + ,.SpiQecCtrlIp ( SpiQecCtrlIp ) + ,.SpiQecCtrlIn ( SpiQecCtrlIn ) + ,.SpiQecCtrlQp ( SpiQecCtrlQp ) + ,.SpiQecCtrlQn ( SpiQecCtrlQn ) + ,.SpiDccCtrlIup ( SpiDccCtrlIup ) + ,.SpiDccCtrlIdn ( SpiDccCtrlIdn ) + ,.SpiDccCtrlQup ( SpiDccCtrlQup ) + ,.SpiDccCtrlQdn ( SpiDccCtrlQdn ) + ,.SpiSiqNOut ( SpiSiqNOut ) + ,.SpiSiqPOut ( SpiSiqPOut ) + ,.SpiSiPOut ( SpiSiPOut ) + ,.SpiSqPOut ( SpiSqPOut ) + ,.CrtlCrossOverN ( CrtlCrossOverN ) + ,.CrtlCrossOverP ( CrtlCrossOverP ) + ,.CcalRsv0 ( CcalRsv0 ) + ,.CcalRsv1 ( CcalRsv1 ) + ,.SelCk10GDig ( SelCk10GDig ) + ,.SelCk2p5GDig ( SelCk2p5GDig ) + ,.SelCk625MDig ( SelCk625MDig ) + ,.P2sDataEn ( P2sDataEn ) + ,.P2sEnAllP ( P2sEnAllP ) + ,.EnPiP ( EnPiP ) + ,.CkDivRstn ( CkDivRstn ) + ,.p2srsv0 ( p2srsv0 ) + ,.p2srsv1 ( p2srsv1 ) + ,.CkRxSw ( CkRxSw ) + ,.RstnCk ( RstnCk ) + ,.CtrlZin ( CtrlZin ) +); + +//------------------------------spi_slave instantiation start---------------------------------- +// DEM +//--------------------------------------------------------------------------------------------- +sirv_gnrl_dffr #(1) DEM_VLD_dffr (wave_data_valid, DEM_VLD, clk, async_rstn); + +DEM_PhaseSync_4008 U_DEM_PhaseSync_4008 ( + .clk ( clk ) + ,.prbs_en ( PrbsEn ) + ,.RST_N ( async_rstn ) + ,.dem_set ( Set ) + ,.data_in ( wave_data_out ) + ,.MSB_OUT ( MSB_OUT ) + ,.LSB_OUT ( LSB_OUT ) + ,.MSB_DUM ( MSB_DUM ) + +); + +endmodule + +`include "../define/chip_undefine.v" diff --git a/DA4008_V1.2/rtl/top/digital_top.sv b/DA4008_V1.2/rtl/top/digital_top.sv new file mode 100644 index 0000000..cb5c5fb --- /dev/null +++ b/DA4008_V1.2/rtl/top/digital_top.sv @@ -0,0 +1,529 @@ +//+FHDR-------------------------------------------------------------------------------------------------------- +// Company: +//----------------------------------------------------------------------------------------------------------------- +// File Name : digital_top.v +// Department : +// Author : pwy +// Author's Tel : +//----------------------------------------------------------------------------------------------------------------- +// Relese History +// Version Date Author Description +// 1.2 2024-04-16 pwy XYZ control the top-level module +//----------------------------------------------------------------------------------------------------------------- +// Keywords : +// +//----------------------------------------------------------------------------------------------------------------- +// Parameter +// +//----------------------------------------------------------------------------------------------------------------- +// Purpose : +// +//----------------------------------------------------------------------------------------------------------------- +// Target Device: +// Tool versions: +//----------------------------------------------------------------------------------------------------------------- +// Reuse Issues +// Reset Strategy: +// Clock Domains: +// Critical Timing: +// Asynchronous I/F: +// Synthesizable (y/n): +// Other: +//-FHDR-------------------------------------------------------------------------------------------------------- + +`include "../define/chip_define.v" + +module digital_top ( + //system port + input clk // System Main Clock + ,input rst_n // Spi Reset active low + ,input sync_in + ,input sync_out + //spi port + ,input [4 :0] cfgid + ,input sclk // Spi Clock + ,input csn // Spi Chip Select active low + ,input mosi // Spi Mosi + ,output miso // Spi Miso + ,output oen + //irq + ,output irq + //wave port + ,output [7 :0] wave_data_out [63:0] + ,output wave_data_valid + //lvds rx + ,input [3 :0] lvds_data + ,input [0 :0] lvds_valid + ,input [0 :0] lvds_clk + ,output [2 :0] phase_tap + //DAC Cfg Port + ,output [3 :0] Rterm + ,output PrbsEn + ,output [14 :0] Set [63:0] + ,output [2 :0] CasAddr + ,output [2 :0] CasDw + ,output [9 :0] IMainCtrl + ,output [3 :0] IBleedCtrl + ,output [3 :0] ICkCml + ,output [31 :0] CurRsv0 + ,output [31 :0] CurRsv1 + //CLK Cfg Port + ,output [0 :0] CcalRstn + ,output [3 :0] EnAllP + ,output [0 :0] DccEn + ,output [0 :0] CasGateCkCtrl + ,output [0 :0] SpiEnPi + ,output [0 :0] SpiEnQec + ,output [0 :0] SpiEnDcc + ,output [4 :0] SpiQecCtrlIp + ,output [4 :0] SpiQecCtrlIn + ,output [4 :0] SpiQecCtrlQp + ,output [4 :0] SpiQecCtrlQn + ,output [5 :0] SpiDccCtrlIup + ,output [5 :0] SpiDccCtrlIdn + ,output [5 :0] SpiDccCtrlQup + ,output [5 :0] SpiDccCtrlQdn + ,output [7 :0] SpiSiqNOut + ,output [7 :0] SpiSiqPOut + ,output [3 :0] SpiSiPOut + ,output [3 :0] SpiSqPOut + ,output [2 :0] CrtlCrossOverN + ,output [2 :0] CrtlCrossOverP + ,output [31 :0] CcalRsv0 + ,output [31 :0] CcalRsv1 + ,output [3 :0] SelCk10GDig + ,output [3 :0] SelCk2p5GDig + ,output [8 :0] SelCk625MDig + ,output [15 :0] P2sDataEn + ,output [15 :0] P2sEnAllP + ,output [15 :0] EnPiP + ,output [15 :0] CkDivRstn + ,output [31 :0] p2srsv0 + ,output [31 :0] p2srsv1 + ,output [15 :0] CkRxSw + ,output [15 :0] RstnCk + ,output [15 :0] CtrlZin +); + +//------------------------------spi_slave instantiation start---------------------------------- +// spi_slave +//--------------------------------------------------------------------------------------------- +sram_if#(25,32) mst(clk); +sram_if#(20,32) slv[3:0](clk); +//connect pll +wire [31 :0] clk_wrdata ; +wire clk_wren ; +wire [7 :0] clk_rwaddr ; +wire clk_rden ; +wire [31 :0] clk_rddata ; +//connect system +wire [31 :0] sys_wrdata ; +wire sys_wren ; +wire [24 :0] sys_rwaddr ; +wire sys_rden ; +wire [31 :0] sys_rddata ; + +wire pll_rstn_o; + +assign mst.wben = 4'hf; + +spi_slave U_spi_slave ( + .clk ( clk ) + ,.rst_n ( pll_rstn_o ) + ,.cfgid ( cfgid ) + ,.sclk ( sclk ) + ,.csn ( csn ) + ,.mosi ( mosi ) + ,.miso ( miso ) + ,.oen ( oen ) + ,.pll_wrdata ( clk_wrdata ) + ,.pll_wren ( clk_wren ) + ,.pll_rwaddr ( clk_rwaddr ) + ,.pll_rden ( clk_rden ) + ,.pll_rddata ( clk_rddata ) + ,.sys_wrdata ( mst.din ) + ,.sys_wren ( mst.wren ) + ,.sys_rwaddr ( mst.addr ) + ,.sys_rden ( mst.rden ) + ,.sys_rddata ( mst.dout ) +); +//--------------------------------------------------------------------------------------------- +// spi_slave +//------------------------------spi_slave instantiation end------------------------------------ + +spi_bus_decoder #( + .SLVNUM ( `SLVNUM ) + ,.SPIBUS_CMD_REG ( `SPIBUS_CMD_REG ) + ,.SPIBUS_OUT_REG ( `SPIBUS_OUT_REG ) + ) U_spi_bus_decoder ( + .clk ( clk ) + ,.rst_n ( pll_rstn_o ) + ,.mst ( mst ) + ,.slv ( slv ) + ); +//--------------------------------------------------------------------------------------------- +// spi_bus_decoder +//------------------------------spi_bus_decoder instantiation end------------------------------ + +//-----------------------------system_regfile instantiation start------------------------------ +// system_regfile as slave device 0 +//--------------------------------------------------------------------------------------------- +wire [2 :0] awg_status ; +wire awg_busy ; +wire sys_soft_rstn ; +wire dout_sel ; +wire [15 :0] sync_delay ; +wire int_sync ; +wire int_sync_en ; +wire sync_oen ; +wire ramp_en ; +wire [31 :0] ramp_ifs ; +wire [7 :0] ramp_step ; +wire ramp_fixed ; +wire [7 :0] ramp_fixed_value ; +//LVDS +wire force_train ; +wire tap_force ; +wire [2 :0] tap_step ; +wire [2 :0] tap_adj_mask ; +wire [19 :0] train_threshold ; +wire descram_en ; +wire always_on ; + ; +wire link_down ; +wire train_ready ; +wire crc_error ; +wire phase_adj_req ; +wire [31 :0] frame_success_cnt; +wire [31 :0] crc_err_cnt ; +wire prefilling ; +wire [31 :0] train_status ; +wire [31 :0] frame_status ; + +systemregfile U_systemregfile ( + .clk ( clk ) + ,.rst_n ( pll_rstn_o ) + ,.wrdata ( slv[0].din ) + ,.wren ( slv[0].wren ) + ,.rwaddr ( slv[0].addr[15:0] ) + ,.rden ( slv[0].rden ) + ,.rddata ( slv[0].dout ) + ,.irq ( irq ) + ,.cmd_fifo_full ( cmd_fifo_full ) + ,.cmd_fifo_empty ( cmd_fifo_empty ) + ,.awg_status ( awg_status ) + ,.awg_busy ( awg_busy ) + ,.sys_soft_rstn ( sys_soft_rstn ) + ,.dout_sel ( dout_sel ) + ,.sync_delay ( sync_delay ) + ,.int_sync ( int_sync ) + ,.int_sync_en ( int_sync_en ) + ,.sync_oen ( sync_oen ) + ,.ramp_en ( ramp_en ) + ,.ramp_ifs ( ramp_ifs ) + ,.ramp_step ( ramp_step ) + ,.ramp_fixed ( ramp_fixed ) + ,.ramp_fixed_value ( ramp_fixed_value ) + ,.force_train ( force_train ) + ,.tap_force ( tap_force ) + ,.tap_step ( tap_step ) + ,.tap_adj_mask ( tap_adj_mask ) + ,.train_threshold ( train_threshold ) + ,.descram_en ( descram_en ) + ,.always_on ( always_on ) + ,.link_down ( link_down ) + ,.train_ready ( train_ready ) + ,.crc_error ( crc_error ) + ,.phase_adj_req ( phase_adj_req ) + ,.phase_tap ( phase_tap ) + ,.frame_success_cnt ( frame_success_cnt ) + ,.crc_err_cnt ( crc_err_cnt ) + ,.prefilling ( prefilling ) + ,.train_status ( train_status ) + ,.frame_status ( frame_status ) +); + + +//--------------------------------------------------------------------------------------------- +// system_regfile +//------------------------------system_regfile instantiation end------------------------------- + +//--------------------------------------------------------------------------------------------- +// rst_gen_unit instantiation start +//--------------------------------------------------------------------------------------------- +wire ch0_rstn_o; + +rst_gen_unit U_rst_gen_unit ( + .async_rstn_i ( rst_n ) + ,.por_rstn_i ( 1'b1 ) + ,.sys_soft_resetn_i ( sys_soft_rstn ) + ,.ch0_soft_rstn_i ( 1'b1 ) + ,.ch1_soft_rstn_i ( 1'b1 ) + ,.ch2_soft_rstn_i ( 1'b1 ) + ,.ch3_soft_rstn_i ( 1'b1 ) + ,.clk ( clk ) + ,.ch0_rstn_o ( ch0_rstn_o ) + ,.ch1_rstn_o ( ) + ,.ch2_rstn_o ( ) + ,.ch3_rstn_o ( ) + ,.pll_rstn_o ( pll_rstn_o ) +); + +//--------------------------------------------------------------------------------------------- +// DW_stream_sync instantiation start +//--------------------------------------------------------------------------------------------- +wire dst_valid ; +wire [3 :0] dst_data ; +wire prefill_d ; +DW_stream_sync #( + .width ( 4 ) + ,.depth ( 32 ) + ,.prefill_lvl ( 16 ) + ,.tst_mode ( 0 ) + ,.verif_en ( 0 ) +) u_dw_stream_sync ( + .clk_s ( lvds_clk ) + ,.rst_s_n ( pll_rstn_o ) + ,.init_s_n ( 1'b1 ) + ,.clr_s ( 1'b0 ) + ,.send_s ( 1'b1 ) + ,.data_s ( lvds_data ) + ,.clr_sync_s ( ) + ,.clr_in_prog_s ( ) + ,.clr_cmplt_s ( ) + ,.clk_d ( clk ) + ,.rst_d_n ( pll_rstn_o ) + ,.init_d_n ( 1'b1 ) + ,.clr_d ( 1'b0 ) + ,.prefill_d ( prefill_d ) + ,.clr_in_prog_d ( ) + ,.clr_sync_d ( ) + ,.clr_cmplt_d ( ) + ,.data_avail_d ( dst_valid ) + ,.data_d ( dst_data ) + ,.prefilling_d ( prefilling ) + ,.test ( 1'b0 ) +); + +//--------------------------------------------------------------------------------------------- +// lvds_rx_4ch instantiation start +//--------------------------------------------------------------------------------------------- +parameter FIFO_DEPTH = 64; +parameter SCRAMBLER_SEED = 32'hFFFFFFFF; + +wire [511:0] wave_awrdata ; +wire [0 :0] wave_awren ; +wire [12 :0] wave_arwaddr ; +wire [63 :0] wave_awrmask ; + +ulink_rx #( + .FIFO_DEPTH ( FIFO_DEPTH ) + ,.SCRAMBLER_SEED ( SCRAMBLER_SEED ) +) dut ( + .clk ( clk ) + ,.rst_n ( pll_rstn_o ) + ,.serial_in ( dst_data ) + ,.patn_count ( train_threshold ) + ,.tap_step ( tap_step ) + ,.descram_en ( descram_en ) + ,.link_down ( link_down ) + ,.delay_tap ( phase_tap ) + ,.wr_addr ( wave_arwaddr ) + ,.wr_data ( wave_awrdata ) + ,.wr_en ( wave_awren ) + ,.byte_mask ( wave_awrmask ) + ,.crc_error ( crc_error ) + ,.tap_adj_mask ( tap_adj_mask ) + ,.tap_force ( tap_force ) + ,.tap_adj_req ( tap_adj_req ) + ,.frame_done ( frame_done ) + ,.train_status ( train_status ) + ,.frame_status ( frame_status ) + ,.always_on ( always_on ) + ,.prefilling ( prefilling ) + ,.prefill_start ( prefill_d ) + ,.train_ready ( train_ready ) + ,.force_train ( force_train ) +); + + +//--------------------------------------------------------------------------------------------- +// sync_int +//------------------------------sync_int instantiation start----------------------------------- + +wire sync_int; +wire sync_pulse; +syncer #(1, 2) sync_in_syncer (clk, pll_rstn_o, sync_in, sync_int); + +sirv_gnrl_dffr #(1) sync_out_dffr (sync_pulse & sync_oen, sync_out, clk, rst_n); +assign sync_out = sync_pulse; +//--------------------------------------------------------------------------------------------- +// Synchronization Signal Delay Adjustment Module instantiation start +//--------------------------------------------------------------------------------------------- + +wire sync_src = (int_sync | sync_int) & int_sync_en; + +pulse_generator pulse_inst_sync ( + .clk ( clk ) + ,.rst_n ( pll_rstn_o ) + ,.pulse_en ( sync_src ) + ,.delay ( sync_delay ) + ,.width ( 16'd1 ) + ,.inv_en ( 1'b0 ) + ,.pulse ( sync_pulse ) +); + +//--------------------------------------------------------------------------------------------- +// sync_int +//------------------------------sync_int instantiation end------------------------------------- + +//--------------------------------------------------------------------------------------------- +// awg_top instantiation start +//--------------------------------------------------------------------------------------------- +wire [511:0] wave_data_out_bank ; + +wire [7 :0] awg_data_out [63:0] ; +wire awg_data_valid ; + +awg_top U_awg_top ( + .clk ( clk ) + ,.rst_n ( ch0_rstn_o ) + ,.start ( sync_pulse ) + ,.wave_awrdata ( wave_awrdata ) + ,.wave_awren ( wave_awren ) + ,.wave_arwaddr ( wave_arwaddr ) + ,.wave_awrmask ( wave_awrmask ) + ,.wave_bwrdata ( slv[2].din ) + ,.wave_bwren ( slv[2].wren ) + ,.wave_brwaddr ( slv[2].addr[18:0] ) + ,.wave_brden ( slv[2].rden ) + ,.wave_brddata ( slv[2].dout ) + ,.cmd_fifo_bwrdata ( slv[1].din ) + ,.cmd_fifo_bwren ( slv[1].wren ) + ,.cmd_fifo_brwaddr ( slv[1].addr[7 :0] ) + ,.cmd_fifo_brden ( slv[1].rden ) + ,.cmd_fifo_brddata ( slv[1].dout ) + ,.wave_data_out ( wave_data_out_bank ) + ,.wave_valid_out ( awg_data_valid ) + ,.cmd_fifo_empty ( cmd_fifo_empty ) + ,.cmd_fifo_full ( cmd_fifo_full ) + ,.status ( awg_status ) + ,.wave_busy ( awg_busy ) + ); + +genvar i; +generate + for(i = 0; i < 64; i++) begin + assign awg_data_out[i] = wave_data_out_bank[8*i +: 8]; + end +endgenerate + +//--------------------------------------------------------------------------------------------- +// ramp_gen instantiation start +//--------------------------------------------------------------------------------------------- +wire [7 :0] ramp_data [63:0]; +wire ramp_vld; +ramp_gen U_ramp_gen ( + //system port + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.dac_mode_sel ( 2'b10 ) + ,.cen ( ramp_en ) + ,.step ( ramp_step ) + ,.ifs ( ramp_ifs ) + ,.fixed ( ramp_fixed ) + ,.fixed_value ( ramp_fixed_value ) + ,.ramp ( ramp_data ) + ,.ramp_vld ( ramp_vld ) +); + + +wire [7 :0] wave_data_out_i [63:0] = dout_sel ? ramp_data : awg_data_out ; +wire wave_data_valid_i = dout_sel ? ramp_vld : awg_data_valid ; + +//--------------------------------------------------------------------------------------------- +// dacif instantiation start +//--------------------------------------------------------------------------------------------- +dacif dacif_inst ( + .clk ( clk ) + ,.rstn ( rst_n ) + ,.din_vld ( wave_data_valid_i ) + ,.din ( wave_data_out_i ) + ,.dout_vld ( wave_data_valid ) + ,.dout ( wave_data_out ) +); + +//--------------------------------------------------------------------------------------------- +// dac_regfile instantiation start +//--------------------------------------------------------------------------------------------- +dac_regfile U_dac_regfile ( + .clk ( clk ) + ,.rstn ( ch0_rstn_o ) + ,.wrdata ( slv[3].din ) + ,.wren ( slv[3].wren ) + ,.rwaddr ( slv[3].addr[15:0] ) + ,.rden ( slv[3].rden ) + ,.rddata ( slv[3].dout ) + ,.Rterm ( Rterm ) + ,.PrbsEn ( PrbsEn ) + ,.Set ( Set ) + ,.CasAddr ( CasAddr ) + ,.CasDw ( CasDw ) + ,.IMainCtrl ( IMainCtrl ) + ,.IBleedCtrl ( IBleedCtrl ) + ,.ICkCml ( ICkCml ) + ,.CurRsv0 ( CurRsv0 ) + ,.CurRsv1 ( CurRsv1 ) +); + +//--------------------------------------------------------------------------------------------- +// clk_regfile instantiation start +//--------------------------------------------------------------------------------------------- +clk_regfile U_clk_regfile ( + .clk ( clk ) + ,.rstn ( pll_rstn_o ) + ,.wrdata ( clk_wrdata ) + ,.wren ( clk_wren ) + ,.rwaddr ( clk_rwaddr ) + ,.rden ( clk_rden ) + ,.rddata ( clk_rddata ) + ,.CcalRstn ( CcalRstn ) + ,.EnAllP ( EnAllP ) + ,.DccEn ( DccEn ) + ,.CasGateCkCtrl ( CasGateCkCtrl ) + ,.SpiEnPi ( SpiEnPi ) + ,.SpiEnQec ( SpiEnQec ) + ,.SpiEnDcc ( SpiEnDcc ) + ,.SpiQecCtrlIp ( SpiQecCtrlIp ) + ,.SpiQecCtrlIn ( SpiQecCtrlIn ) + ,.SpiQecCtrlQp ( SpiQecCtrlQp ) + ,.SpiQecCtrlQn ( SpiQecCtrlQn ) + ,.SpiDccCtrlIup ( SpiDccCtrlIup ) + ,.SpiDccCtrlIdn ( SpiDccCtrlIdn ) + ,.SpiDccCtrlQup ( SpiDccCtrlQup ) + ,.SpiDccCtrlQdn ( SpiDccCtrlQdn ) + ,.SpiSiqNOut ( SpiSiqNOut ) + ,.SpiSiqPOut ( SpiSiqPOut ) + ,.SpiSiPOut ( SpiSiPOut ) + ,.SpiSqPOut ( SpiSqPOut ) + ,.CrtlCrossOverN ( CrtlCrossOverN ) + ,.CrtlCrossOverP ( CrtlCrossOverP ) + ,.CcalRsv0 ( CcalRsv0 ) + ,.CcalRsv1 ( CcalRsv1 ) + ,.SelCk10GDig ( SelCk10GDig ) + ,.SelCk2p5GDig ( SelCk2p5GDig ) + ,.SelCk625MDig ( SelCk625MDig ) + ,.P2sDataEn ( P2sDataEn ) + ,.P2sEnAllP ( P2sEnAllP ) + ,.EnPiP ( EnPiP ) + ,.CkDivRstn ( CkDivRstn ) + ,.p2srsv0 ( p2srsv0 ) + ,.p2srsv1 ( p2srsv1 ) + ,.CkRxSw ( CkRxSw ) + ,.RstnCk ( RstnCk ) + ,.CtrlZin ( CtrlZin ) +); + +endmodule +`include "../define/chip_undefine.v" + diff --git a/DA4008_V1.2/sim/chip_top/Makefile b/DA4008_V1.2/sim/chip_top/Makefile new file mode 100644 index 0000000..b1f80ac --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/Makefile @@ -0,0 +1,72 @@ + +WAVE ?= 0 + +SIM = RTL + +folder = simv + +ifeq ($(WAVE),1) + WAVE_OPTS = -debug_access+all -debug_region+cell+encrypt -P $(NOVAS_HOME)/share/PLI/VCS/linux64/novas_new_dumper.tab $(NOVAS_HOME)/share/PLI/VCS/linux64/pli.a +define+DUMP_FSDB + WAVE_SIM_OPTS = -fsdbDumpfile=sim.fsdb + else + WAVE_OPTS = -debug_access+pp +endif + +ifeq ($(SIM),PostPr) +VCS = vcs -full64 -sverilog -Mupdate +lint=TFIPC-L +v2k +warn=noSDFCOM_IWSBA,noNTCDNC -notice +mindelays +tchk+edge+warn +neg_tchk -negdelay +overlap +sdfverbose -sdfretain +optconfigfile+notimingcheck.cfg -override_timescale=1ns/1ps -debug_access+all $(WAVE_OPTS) -lca -q -l compile.log -cm line+cond+fsm+tgl+branch -cm_dir ./coverage/simv.vdb |tee +else +VCS = vcs -full64 -j8 -sverilog +lint=TFIPC-L +v2k $(WAVE_OPTS) -lca -q -timescale=1ns/1ps +nospecify -l compile.log -cm line+cond+fsm+tgl+branch -cm_dir ./coverage/simv.vdb +endif + +ifeq ($(SIM),PostPr) + post_dir = ./data_PostPr +else + post_dir = ./data_PostSyn +endif + + +ifeq ($(SIM),PostSyn) +FileList = filelist_syn.f +else + ifeq ($(SIM),PostPr) + FileList = filelist_pr.f + else + FileList = filelist_vlg.f + endif +endif + +SIMV = ./simv sync:busywait -Xdprof=timeline $(WAVE_SIM_OPTS) -l |tee sim.log + +all:comp run + +comp: + ${VCS} -f $(FileList) +incdir+./../../rtl/define +incdir+./../../rtl/qubitmcu +incdir+./../../model + +run: + ${SIMV} + +dbg: + verdi -sverilog -f $(FileList) -top TB -ssf *.fsdb -nologo & + +clean: + rm -rf DVE* simv* *log ucli.key verdiLog urgReport csrc novas.* *fsdb* *.dat *.daidir *.vdb *~ + +compare: + ./compare_files.csh ${post_dir} ./data_RTL ./compare.txt + +regress: + ./regress.csh $(SIM) + +rmwork: + rm -rf ./work* + +rmdata: + rm -rf ./data* +cov: + verdi -cov -covdir coverage/merged.vdb & +cov_d: + dve -full64 -covdir coverage/*.vdb & +merge: + urg -full64 -dbname coverage/merged.vdb -flex_merge union -dir coverage/simv.vdb -parallel -maxjobs 64& +merge_i: + urg -full64 -flex_merge union -dir coverage/merged.vdb -dir coverage/$(folder) -dbname coverage/merged.vdb -parallel -maxjobs 64& diff --git a/DA4008_V1.2/sim/chip_top/TB.sv b/DA4008_V1.2/sim/chip_top/TB.sv new file mode 100644 index 0000000..cb51390 --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/TB.sv @@ -0,0 +1,390 @@ +`include "../../rtl/define/chip_define.v" + +`include "../../model/SPI_DRIVER.sv" + +`include "../../model/LVDS_DRIVER.sv" + +`timescale 1ns/1ps + +module TB (); + +//################################### +// Generate Clocks & Reset +//################################### + +//Generate Clock +localparam PERIOD = 1.536; +logic clk ; +//clk +clock_tb #( + .PERIOD ( PERIOD ) + ,.PHASE ( 0 ) + )clk_inst ( + .clk_out ( clk ) +); + +//clk_40g +logic clk_40g; +clock_tb #( + .PERIOD ( 0.024) + ,.PHASE ( 0 ) + )clk_40g_inst ( + .clk_out ( clk_40g ) +); +//Generate Reset +logic rst_n; + +int file_path; +string CONFIG_FILE = ""; +string DATA_O_FILE = ""; +parameter string CASE_TEMP = "../../case_temp.txt"; +parameter string DATA_TEMP = "../../data_temp.txt"; +parameter string LVDS_FILE = "../../../../case/lvds/0305/lvds.txt"; +initial begin + file_path = $fopen(CASE_TEMP, "r"); + if(file_path != 0) begin + $fscanf(file_path, "%s", CONFIG_FILE); + $display(CONFIG_FILE); + $fclose(file_path); + end + file_path = $fopen(DATA_TEMP, "r"); + if(file_path != 0) begin + $fscanf(file_path, "%s", DATA_O_FILE); + $display(DATA_O_FILE); + $fclose(file_path); + end + + $fsdbAutoSwitchDumpfile(500, "./verdplus.fsdb", 1000000); + $fsdbDumpvars(); + $fsdbDumpMDA(); +end + +//################################### +// configure the dut +//################################### +virtual spi_if vif; +spi_if spi_bus(.clk(clk), .rstn(rst_n)); + +virtual lvds_if lvds_vif; +lvds_if lvds_bus(.clk(clk)); + + + +initial begin + spi_bus.sclk = 1'b1; + spi_bus.mosi = 1'b0; + spi_bus.csn = 1'b1; + vif = spi_bus; + lvds_vif = lvds_bus; +end + +spi_driver my_drv; +lvds_driver lvds_drv; +logic start; + +initial begin + rst_n = 1'b0; + start = 1'b0; + + lvds_drv = new(); + //lvds_drv.file_path = LVDS_FILE; + lvds_drv.drv_if = lvds_vif; + + + my_drv = new(); + my_drv.file_path = CONFIG_FILE; + my_drv.itf = vif; + + # 20; + rst_n = 1'b1; + + //lvds_drv.do_drive(); + lvds_drv.train_count = 100; // ÉèÖÃѵÁ·´ÎÊý + lvds_drv.send_training(); // ·¢ËÍѵÁ·ÐòÁÐ + lvds_drv.scrambler_en = 1; + lvds_drv.send_frame_from_file(LVDS_FILE); // ·¢ËÍÊý¾ÝÖ¡ + + file_path = $fopen(DATA_O_FILE, "w"); + my_drv.do_drive(file_path); + $fclose(file_path); + + # 30; + start = 1'b1; + # PERIOD; + # PERIOD; + start = 1'b0; + + # 30000; + + file_path = $fopen(DATA_O_FILE, "w"); + my_drv.do_drive(file_path); + $fclose(file_path); + + start = 1'b1; + # PERIOD; + # PERIOD; + start = 1'b0; + + # 30000; + + file_path = $fopen(DATA_O_FILE, "w"); + my_drv.do_drive(file_path); + $fclose(file_path); + + start = 1'b1; + # PERIOD; + # PERIOD; + start = 1'b0; + + # 30000; + + $finish(0); +end + +//////////////////////////////////////////////////////////////////////////////////////// +//DUT +//////////////////////////////////////////////////////////////////////////////////////// + +//sync_out +logic sync_out ; +//irq +logic irq ; +//lvds rx +logic [3 :0] lvds_data = '0; +logic [0 :0] lvds_valid = '0; +logic [0 :0] lvds_clk = '0; +//DAC Data +logic [6 :0] MSB_OUT [63:0] ; +logic [4 :0] LSB_OUT [63:0] ; +logic MSB_DUM [63:0] ; +logic DEM_VLD ; +//DAC Cfg Port +logic [3 :0] Rterm ; +logic [2 :0] CasAddr ; +logic [2 :0] CasDw ; +logic [9 :0] IMainCtrl ; +logic [3 :0] IBleedCtrl ; +logic [3 :0] ICkCml ; +logic [31 :0] CurRsv0 ; +logic [31 :0] CurRsv1 ; +//CLK Cfg Port +logic [0 :0] CcalRstn ; +logic [3 :0] EnAllP ; +logic [0 :0] DccEn ; +logic [0 :0] CasGateCkCtrl ; +logic [0 :0] SpiEnPi ; +logic [0 :0] SpiEnQec ; +logic [0 :0] SpiEnDcc ; +logic [4 :0] SpiQecCtrlIp ; +logic [4 :0] SpiQecCtrlIn ; +logic [4 :0] SpiQecCtrlQp ; +logic [4 :0] SpiQecCtrlQn ; +logic [5 :0] SpiDccCtrlIup ; +logic [5 :0] SpiDccCtrlIdn ; +logic [5 :0] SpiDccCtrlQup ; +logic [5 :0] SpiDccCtrlQdn ; +logic [7 :0] SpiSiqNOut ; +logic [7 :0] SpiSiqPOut ; +logic [3 :0] SpiSiPOut ; +logic [3 :0] SpiSqPOut ; +logic [2 :0] CrtlCrossOverN ; +logic [2 :0] CrtlCrossOverP ; +logic [31 :0] CcalRsv0 ; +logic [31 :0] CcalRsv1 ; +logic [3 :0] SelCk10GDig ; +logic [3 :0] SelCk2p5GDig ; +logic [8 :0] SelCk625MDig ; +logic [15 :0] P2sDataEn ; +logic [15 :0] P2sEnAllP ; +logic [15 :0] EnPiP ; +logic [15 :0] CkDivRstn ; +logic [31 :0] p2srsv0 ; +logic [31 :0] p2srsv1 ; +logic [15 :0] CkRxSw ; +logic [15 :0] RstnCk ; +logic [15 :0] CtrlZin ; + + +da4008_chip_top U_da4008_chip_top ( + .PI_sclk ( spi_bus.sclk ) + ,.PI_csn ( spi_bus.csn ) + ,.PI_mosi ( spi_bus.mosi ) + ,.PO_miso ( spi_bus.miso ) + ,.PO_irq ( irq ) + ,.PI_async_rstn ( rst_n ) + ,.PI_sync_in ( start ) + ,.PO_sync_out ( sync_out ) + ,.clk ( clk ) + ,.lvds_data ( lvds_bus.data ) + ,.lvds_valid ( lvds_bus.valid ) + ,.lvds_clk ( lvds_bus.clk ) + ,.MSB_OUT ( MSB_OUT ) + ,.LSB_OUT ( LSB_OUT ) + ,.MSB_DUM ( MSB_DUM ) + ,.DEM_VLD ( DEM_VLD ) + ,.Rterm ( Rterm ) + ,.CasAddr ( CasAddr ) + ,.CasDw ( CasDw ) + ,.IMainCtrl ( IMainCtrl ) + ,.IBleedCtrl ( IBleedCtrl ) + ,.ICkCml ( ICkCml ) + ,.CurRsv0 ( CurRsv0 ) + ,.CurRsv1 ( CurRsv1 ) + ,.CcalRstn ( CcalRstn ) + ,.EnAllP ( EnAllP ) + ,.DccEn ( DccEn ) + ,.CasGateCkCtrl ( CasGateCkCtrl ) + ,.SpiEnPi ( SpiEnPi ) + ,.SpiEnQec ( SpiEnQec ) + ,.SpiEnDcc ( SpiEnDcc ) + ,.SpiQecCtrlIp ( SpiQecCtrlIp ) + ,.SpiQecCtrlIn ( SpiQecCtrlIn ) + ,.SpiQecCtrlQp ( SpiQecCtrlQp ) + ,.SpiQecCtrlQn ( SpiQecCtrlQn ) + ,.SpiDccCtrlIup ( SpiDccCtrlIup ) + ,.SpiDccCtrlIdn ( SpiDccCtrlIdn ) + ,.SpiDccCtrlQup ( SpiDccCtrlQup ) + ,.SpiDccCtrlQdn ( SpiDccCtrlQdn ) + ,.SpiSiqNOut ( SpiSiqNOut ) + ,.SpiSiqPOut ( SpiSiqPOut ) + ,.SpiSiPOut ( SpiSiPOut ) + ,.SpiSqPOut ( SpiSqPOut ) + ,.CrtlCrossOverN ( CrtlCrossOverN ) + ,.CrtlCrossOverP ( CrtlCrossOverP ) + ,.CcalRsv0 ( CcalRsv0 ) + ,.CcalRsv1 ( CcalRsv1 ) + ,.SelCk10GDig ( SelCk10GDig ) + ,.SelCk2p5GDig ( SelCk2p5GDig ) + ,.SelCk625MDig ( SelCk625MDig ) + ,.P2sDataEn ( P2sDataEn ) + ,.P2sEnAllP ( P2sEnAllP ) + ,.EnPiP ( EnPiP ) + ,.CkDivRstn ( CkDivRstn ) + ,.p2srsv0 ( p2srsv0 ) + ,.p2srsv1 ( p2srsv1 ) + ,.CkRxSw ( CkRxSw ) + ,.RstnCk ( RstnCk ) + ,.CtrlZin ( CtrlZin ) +); + +//////////////////////////////////////////////////////////////////////////////////////// +//DEM_Reverse_64CH +//////////////////////////////////////////////////////////////////////////////////////// + +logic vld_out ; +logic [7 :0] data_out [63:0] ; + +DEM_Reverse_64CH U_DEM_Reverse_64CH ( + .clk ( clk ) + ,.msb_in ( MSB_OUT ) + ,.lsb_in ( LSB_OUT ) + ,.vld_in ( DEM_VLD ) + ,.vld_out ( vld_out ) + ,.data_out ( data_out ) +); + +logic [7 :0] data_out_r [63:0] ; +logic vld_out_r ; + +always @(posedge clk_40g) begin + data_out_r <= data_out ; + vld_out_r <= vld_out ; +end +/////////////////////////////////////////////////////////////////////// +//DA4008 DEM output data save +/////////////////////////////////////////////////////////////////////// + +wire add_cnt = vld_out_r; +wire end_cnt = 1'b0; + +logic [5 :0] cnt_c; +wire [5 :0] cnt_n = end_cnt ? 6'h0 : + add_cnt ? cnt_c + 1'b1 : + cnt_c ; + +always @(posedge clk_40g or negedge rst_n) begin + if(rst_n==1'b0) begin + cnt_c <= 6'd0; + end + else begin + cnt_c <= cnt_n; + end +end + + + +logic [7:0] cs_wave; +always @(posedge clk_40g or negedge rst_n) begin + if(rst_n==1'b0) begin + cs_wave <= 16'h0; + end + else begin + case(cnt_c) + 6'd0 : cs_wave <= {~data_out_r[0 ][7],data_out_r[0 ][6:0]}; + 6'd1 : cs_wave <= {~data_out_r[1 ][7],data_out_r[1 ][6:0]}; + 6'd2 : cs_wave <= {~data_out_r[2 ][7],data_out_r[2 ][6:0]}; + 6'd3 : cs_wave <= {~data_out_r[3 ][7],data_out_r[3 ][6:0]}; + 6'd4 : cs_wave <= {~data_out_r[4 ][7],data_out_r[4 ][6:0]}; + 6'd5 : cs_wave <= {~data_out_r[5 ][7],data_out_r[5 ][6:0]}; + 6'd6 : cs_wave <= {~data_out_r[6 ][7],data_out_r[6 ][6:0]}; + 6'd7 : cs_wave <= {~data_out_r[7 ][7],data_out_r[7 ][6:0]}; + 6'd8 : cs_wave <= {~data_out_r[8 ][7],data_out_r[8 ][6:0]}; + 6'd9 : cs_wave <= {~data_out_r[9 ][7],data_out_r[9 ][6:0]}; + 6'd10 : cs_wave <= {~data_out_r[10][7],data_out_r[10][6:0]}; + 6'd11 : cs_wave <= {~data_out_r[11][7],data_out_r[11][6:0]}; + 6'd12 : cs_wave <= {~data_out_r[12][7],data_out_r[12][6:0]}; + 6'd13 : cs_wave <= {~data_out_r[13][7],data_out_r[13][6:0]}; + 6'd14 : cs_wave <= {~data_out_r[14][7],data_out_r[14][6:0]}; + 6'd15 : cs_wave <= {~data_out_r[15][7],data_out_r[15][6:0]}; + 6'd16 : cs_wave <= {~data_out_r[16][7],data_out_r[16][6:0]}; + 6'd17 : cs_wave <= {~data_out_r[17][7],data_out_r[17][6:0]}; + 6'd18 : cs_wave <= {~data_out_r[18][7],data_out_r[18][6:0]}; + 6'd19 : cs_wave <= {~data_out_r[19][7],data_out_r[19][6:0]}; + 6'd20 : cs_wave <= {~data_out_r[20][7],data_out_r[20][6:0]}; + 6'd21 : cs_wave <= {~data_out_r[21][7],data_out_r[21][6:0]}; + 6'd22 : cs_wave <= {~data_out_r[22][7],data_out_r[22][6:0]}; + 6'd23 : cs_wave <= {~data_out_r[23][7],data_out_r[23][6:0]}; + 6'd24 : cs_wave <= {~data_out_r[24][7],data_out_r[24][6:0]}; + 6'd25 : cs_wave <= {~data_out_r[25][7],data_out_r[25][6:0]}; + 6'd26 : cs_wave <= {~data_out_r[26][7],data_out_r[26][6:0]}; + 6'd27 : cs_wave <= {~data_out_r[27][7],data_out_r[27][6:0]}; + 6'd28 : cs_wave <= {~data_out_r[28][7],data_out_r[28][6:0]}; + 6'd29 : cs_wave <= {~data_out_r[29][7],data_out_r[29][6:0]}; + 6'd30 : cs_wave <= {~data_out_r[30][7],data_out_r[30][6:0]}; + 6'd31 : cs_wave <= {~data_out_r[31][7],data_out_r[31][6:0]}; + 6'd32 : cs_wave <= {~data_out_r[32][7],data_out_r[32][6:0]}; + 6'd33 : cs_wave <= {~data_out_r[33][7],data_out_r[33][6:0]}; + 6'd34 : cs_wave <= {~data_out_r[34][7],data_out_r[34][6:0]}; + 6'd35 : cs_wave <= {~data_out_r[35][7],data_out_r[35][6:0]}; + 6'd36 : cs_wave <= {~data_out_r[36][7],data_out_r[36][6:0]}; + 6'd37 : cs_wave <= {~data_out_r[37][7],data_out_r[37][6:0]}; + 6'd38 : cs_wave <= {~data_out_r[38][7],data_out_r[38][6:0]}; + 6'd39 : cs_wave <= {~data_out_r[39][7],data_out_r[39][6:0]}; + 6'd40 : cs_wave <= {~data_out_r[40][7],data_out_r[40][6:0]}; + 6'd41 : cs_wave <= {~data_out_r[41][7],data_out_r[41][6:0]}; + 6'd42 : cs_wave <= {~data_out_r[42][7],data_out_r[42][6:0]}; + 6'd43 : cs_wave <= {~data_out_r[43][7],data_out_r[43][6:0]}; + 6'd44 : cs_wave <= {~data_out_r[44][7],data_out_r[44][6:0]}; + 6'd45 : cs_wave <= {~data_out_r[45][7],data_out_r[45][6:0]}; + 6'd46 : cs_wave <= {~data_out_r[46][7],data_out_r[46][6:0]}; + 6'd47 : cs_wave <= {~data_out_r[47][7],data_out_r[47][6:0]}; + 6'd48 : cs_wave <= {~data_out_r[48][7],data_out_r[48][6:0]}; + 6'd49 : cs_wave <= {~data_out_r[49][7],data_out_r[49][6:0]}; + 6'd50 : cs_wave <= {~data_out_r[50][7],data_out_r[50][6:0]}; + 6'd51 : cs_wave <= {~data_out_r[51][7],data_out_r[51][6:0]}; + 6'd52 : cs_wave <= {~data_out_r[52][7],data_out_r[52][6:0]}; + 6'd53 : cs_wave <= {~data_out_r[53][7],data_out_r[53][6:0]}; + 6'd54 : cs_wave <= {~data_out_r[54][7],data_out_r[54][6:0]}; + 6'd55 : cs_wave <= {~data_out_r[55][7],data_out_r[55][6:0]}; + 6'd56 : cs_wave <= {~data_out_r[56][7],data_out_r[56][6:0]}; + 6'd57 : cs_wave <= {~data_out_r[57][7],data_out_r[57][6:0]}; + 6'd58 : cs_wave <= {~data_out_r[58][7],data_out_r[58][6:0]}; + 6'd59 : cs_wave <= {~data_out_r[59][7],data_out_r[59][6:0]}; + 6'd60 : cs_wave <= {~data_out_r[60][7],data_out_r[60][6:0]}; + 6'd61 : cs_wave <= {~data_out_r[61][7],data_out_r[61][6:0]}; + 6'd62 : cs_wave <= {~data_out_r[62][7],data_out_r[62][6:0]}; + 6'd63 : cs_wave <= {~data_out_r[63][7],data_out_r[63][6:0]}; + endcase + end +end +endmodule diff --git a/DA4008_V1.2/sim/chip_top/TB说明.md b/DA4008_V1.2/sim/chip_top/TB说明.md new file mode 100644 index 0000000..a765a71 --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/TB说明.md @@ -0,0 +1,92 @@ +# 测试平台说明文档 (TB.sv) + +## 1. 概述 + +本测试平台用于验证 `da4008_chip_top` 芯片的数字功能。通过 SPI 接口配置芯片内部寄存器,并通过 LVDS 接口输入数据帧,观察芯片输出的并行数据(MSB_OUT/LSB_OUT)以及经过后处理的波形数据。测试平台包含时钟生成、复位控制、驱动器模型、待测芯片实例化以及数据采集逻辑。 + +## 2. 主要模块及功能 + +### 2.1 时钟生成 + +- **clk**:周期 1.536 ns,用于芯片主时钟。 +- **clk_40g**:周期 0.024 ns,用于高速数据采集(后处理模块采样时钟)。 + +两个时钟均由 `clock_tb` 模块实例化产生。 + +### 2.2 复位信号 + +- `rst_n`:低有效复位,初始为 0,延迟 20 ns 后置为 1。 + +### 2.3 配置文件读取 + +测试平台通过读取临时文件获取配置和数据的路径: + +- `CASE_TEMP = "../../case_temp.txt"`:存储 SPI 配置文件路径。 +- `DATA_TEMP = "../../data_temp.txt"`:存储输出数据文件路径。 +- `LVDS_FILE = "../../../../case/lvds/0305/lvds.txt"`:LVDS 输入数据文件路径。 + +在 `initial` 块中读取这些路径,并存入 `CONFIG_FILE` 和 `DATA_O_FILE` 字符串变量。 + +### 2.4 接口及驱动器 + +- **SPI 接口**:`spi_if` 模块实例化为 `spi_bus`,包含 `sclk`、`mosi`、`miso`、`csn` 信号。通过 `virtual spi_if vif` 传递。 +- **LVDS 接口**:`lvds_if` 模块实例化为 `lvds_bus`,包含 `data`、`valid`、`clk` 信号。通过 `virtual lvds_if lvds_vif` 传递。 +- **SPI 驱动器**:`spi_driver` 类对象 `my_drv`,负责从 `CONFIG_FILE` 读取配置序列并驱动 SPI 总线,同时将读取的结果写入 `DATA_O_FILE`。 +- **LVDS 驱动器**:`lvds_driver` 类对象 `lvds_drv`,负责从 `LVDS_FILE` 读取数据帧并驱动 LVDS 总线。先发送训练序列(`train_count = 100`),然后发送加扰数据帧。 + +### 2.5 测试流程 + +1. 初始化复位和驱动器对象。 +2. 释放复位后,LVDS 驱动器发送训练序列和数据帧。 +3. 首次调用 `my_drv.do_drive(file_path)` 将 SPI 配置写入芯片(同时可能回读并保存)。 +4. 拉高 `start` 信号两个周期,启动芯片内部同步。 +5. 等待 30,000 ns 后再次调用 `do_drive` 保存数据。 +6. 重复步骤 4-5 两次,共三次数据采集。 +7. 仿真结束(`$finish`)。 + +### 2.6 待测芯片实例化 + +`da4008_chip_top` 例化为 `U_da4008_chip_top`,连接信号包括: + +- SPI 接口:`PI_sclk`, `PI_csn`, `PI_mosi`, `PO_miso` +- 中断:`PO_irq` +- 同步信号:`PI_sync_in` (start), `PO_sync_out` +- 时钟:`clk` +- LVDS 输入:`lvds_data`, `lvds_valid`, `lvds_clk` +- DAC 输出总线:`MSB_OUT[63:0]`, `LSB_OUT[63:0]`, `MSB_DUM[63:0]`, `DEM_VLD` +- 各类配置端口(电流、时钟、P2S 等) + +### 2.7 后处理模块 + +- **DEM_Reverse_64CH**:将 `MSB_OUT` 和 `LSB_OUT` 合并并反向排列,输出 64 路 8 位数据 `data_out[63:0]` 及有效信号 `vld_out`。 +- 使用 `clk_40g` 将 `data_out` 和 `vld_out` 打一拍得到 `data_out_r` 和 `vld_out_r`。 +- 计数器 `cnt_c`:在 `vld_out_r` 有效时递增(0~63 循环),用于轮询选择当前通道数据。 +- `cs_wave`:根据 `cnt_c` 选择对应通道的 `data_out_r`,并将最高位取反(可能是为了满足特定输出格式),输出 8 位波形数据。 + +### 2.8 波形记录 + +使用 `$fsdbAutoSwitchDumpfile` 和 `$fsdbDumpvars` 记录 FSDB 格式波形,支持 MDA 转储,便于调试。 + +## 3. 文件依赖 + +- `../../rtl/define/chip_define.v`:芯片定义文件。 +- `../../model/SPI_DRIVER.sv`:SPI 驱动器模型。 +- `../../model/LVDS_DRIVER.sv`:LVDS 驱动器模型。 +- `clock_tb` 时钟发生模块。 +- `spi_if`、`lvds_if` SPI接口文件。 +- `DEM_Reverse_64CH` DEM解码模块。 + +## 4. 仿真控制 + +通过修改 `case_temp.txt` 和 `data_temp.txt` 可指定不同的配置文件和输出文件。LVDS 数据文件路径固定为 `LVDS_FILE`,可根据需要修改。 + +## 5. 注意事项 + +- 仿真时间单位/精度为 1ns/1ps。 +- 驱动器的具体实现未在此文件中给出,需确保相关模型正确。 +- 多次调用 `my_drv.do_drive` 可能用于在不同时刻捕获芯片内部状态。 +- `cs_wave` 的生成方式暗示了数据采集的时序要求,需保证 `clk_40g` 与芯片输出时钟的同步关系。 + +--- + +以上为该测试平台的结构与功能说明,可作为仿真环境的使用参考。 \ No newline at end of file diff --git a/DA4008_V1.2/sim/chip_top/TB说明.pdf b/DA4008_V1.2/sim/chip_top/TB说明.pdf new file mode 100644 index 0000000000000000000000000000000000000000..941aaac31b645635fe75100d591b5f573eb278a8 GIT binary patch literal 228691 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�uvl-FSIaN6@+PF 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 X-P70oy+53s{9GIyD73WFsxtotZn_z) literal 0 HcmV?d00001 diff --git a/DA4008_V1.2/sim/chip_top/backup/Makefile b/DA4008_V1.2/sim/chip_top/backup/Makefile new file mode 100644 index 0000000..b1f80ac --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/backup/Makefile @@ -0,0 +1,72 @@ + +WAVE ?= 0 + +SIM = RTL + +folder = simv + +ifeq ($(WAVE),1) + WAVE_OPTS = -debug_access+all -debug_region+cell+encrypt -P $(NOVAS_HOME)/share/PLI/VCS/linux64/novas_new_dumper.tab $(NOVAS_HOME)/share/PLI/VCS/linux64/pli.a +define+DUMP_FSDB + WAVE_SIM_OPTS = -fsdbDumpfile=sim.fsdb + else + WAVE_OPTS = -debug_access+pp +endif + +ifeq ($(SIM),PostPr) +VCS = vcs -full64 -sverilog -Mupdate +lint=TFIPC-L +v2k +warn=noSDFCOM_IWSBA,noNTCDNC -notice +mindelays +tchk+edge+warn +neg_tchk -negdelay +overlap +sdfverbose -sdfretain +optconfigfile+notimingcheck.cfg -override_timescale=1ns/1ps -debug_access+all $(WAVE_OPTS) -lca -q -l compile.log -cm line+cond+fsm+tgl+branch -cm_dir ./coverage/simv.vdb |tee +else +VCS = vcs -full64 -j8 -sverilog +lint=TFIPC-L +v2k $(WAVE_OPTS) -lca -q -timescale=1ns/1ps +nospecify -l compile.log -cm line+cond+fsm+tgl+branch -cm_dir ./coverage/simv.vdb +endif + +ifeq ($(SIM),PostPr) + post_dir = ./data_PostPr +else + post_dir = ./data_PostSyn +endif + + +ifeq ($(SIM),PostSyn) +FileList = filelist_syn.f +else + ifeq ($(SIM),PostPr) + FileList = filelist_pr.f + else + FileList = filelist_vlg.f + endif +endif + +SIMV = ./simv sync:busywait -Xdprof=timeline $(WAVE_SIM_OPTS) -l |tee sim.log + +all:comp run + +comp: + ${VCS} -f $(FileList) +incdir+./../../rtl/define +incdir+./../../rtl/qubitmcu +incdir+./../../model + +run: + ${SIMV} + +dbg: + verdi -sverilog -f $(FileList) -top TB -ssf *.fsdb -nologo & + +clean: + rm -rf DVE* simv* *log ucli.key verdiLog urgReport csrc novas.* *fsdb* *.dat *.daidir *.vdb *~ + +compare: + ./compare_files.csh ${post_dir} ./data_RTL ./compare.txt + +regress: + ./regress.csh $(SIM) + +rmwork: + rm -rf ./work* + +rmdata: + rm -rf ./data* +cov: + verdi -cov -covdir coverage/merged.vdb & +cov_d: + dve -full64 -covdir coverage/*.vdb & +merge: + urg -full64 -dbname coverage/merged.vdb -flex_merge union -dir coverage/simv.vdb -parallel -maxjobs 64& +merge_i: + urg -full64 -flex_merge union -dir coverage/merged.vdb -dir coverage/$(folder) -dbname coverage/merged.vdb -parallel -maxjobs 64& diff --git a/DA4008_V1.2/sim/chip_top/backup/filelist_syn.f b/DA4008_V1.2/sim/chip_top/backup/filelist_syn.f new file mode 100644 index 0000000..59d68ec --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/backup/filelist_syn.f @@ -0,0 +1,23 @@ +../../../../rtl/define/chip_define.v +../../../../sim/chip_top/TB.sv +../../../../model/spi_if.sv +../../../../model/DW01_addsub.v +../../../../model/DW02_mult.v +../../../../model/DW_mult_pipe.v +../../../../model/clk_gen.v +../../../../model/clock_tb.v +../../../../model/reset_tb.v +../../../../model/thermo2binary_top.v +../../../../model/thermo7_binary3.v +../../../../model/thermo15_binary4.v +../../../../model/glbl.v +../../../../rtl/memory/tsdn28hpcpuhdb128x128m4mw_170a_ffg0p99v0c.v +../../../../rtl/memory/tsdn28hpcpuhdb4096x32m4mw_170a_ffg0p99v0c.v +../../../../rtl/memory/tsdn28hpcpuhdb64x32m4mw_170a_ffg0p99v0c.v +../../../../rtl/memory/tsdn28hpcpuhdb512x128m4mwr_170a_ffg0p99v0c.v +../../../../rtl/memory/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v +../../../../rtl/dem/DEM_31MSB_decoder_1ch.v +../../../../rtl/dem/DEM_31MSB_decoder_16ch_XY.v +/data/pdk/TSMCHOME/digital/Front_End/verilog/tphn28hpcpgv18_110a/tphn28hpcpgv18.v +../../../../lib/tcbn28hpcplusbwp7t35p140.v +../../../../syn/current/outputs/xyz_chip_top.syn.v diff --git a/DA4008_V1.2/sim/chip_top/backup/filelist_vlg.f b/DA4008_V1.2/sim/chip_top/backup/filelist_vlg.f new file mode 100644 index 0000000..c92f7d1 --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/backup/filelist_vlg.f @@ -0,0 +1,46 @@ +../../../../rtl/define/chip_define.v +../../../../lib/tphn28hpcpgv18.v +../../../../lib/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v +../../../../rtl/io/iopad.v +../../../../rtl/systemregfile/systemregfile.v +../../../../rtl/dacif/dacif.v +../../../../rtl/fifo/syn_fwft_fifo.v +../../../../rtl/dac_regfile/dac_regfile.v +../../../../rtl/lvds/ulink_rx.sv +../../../../rtl/rstgen/rst_gen_unit.v +../../../../rtl/rstgen/rst_sync.v +../../../../rtl/comm/sirv_gnrl_xchecker.v +../../../../rtl/comm/pulse_generator.sv +../../../../rtl/comm/sirv_gnrl_dffs.v +../../../../rtl/comm/syncer.v +../../../../rtl/comm/ramp_gen.v +../../../../rtl/memory/tsmc_dpram.v +../../../../rtl/memory/sram_if.sv +../../../../rtl/memory/sram_dmux.sv +../../../../rtl/memory/dpram.v +../../../../rtl/memory/bhv_spram.v +../../../../rtl/memory/spram.v +../../../../rtl/clk/clk_regfile.v +../../../../rtl/awg/awg_top.sv +../../../../rtl/awg/awg_ctrl.v +../../../../rtl/dem/DEM_PhaseSync_4008.sv +../../../../rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v +../../../../rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v +../../../../rtl/top/da4008_chip_top.sv +../../../../rtl/top/digital_top.sv +../../../../rtl/spi/spi_bus_decoder.sv +../../../../rtl/spi/spi_slave.v +../../../../rtl/spi/spi_pll.v +../../../../rtl/spi/spi_sys.v +../../../../model/clock_tb.v +../../../../model/spi_if.sv +../../../../model/clk_gen.v +../../../../model/DEM_Reverse_64CH.v +../../../../model/DEM_Reverse.v +../../../../model/reset_tb.v +../../../../model/DW_stream_sync.v +../../../../model/DW_reset_sync.v +../../../../model/DW_sync.v +../../../../model/DW_pulse_sync.v +../../../../sim/chip_top/TB.sv +../../../../rtl/define/chip_undefine.v diff --git a/DA4008_V1.2/sim/chip_top/filelist_syn.f b/DA4008_V1.2/sim/chip_top/filelist_syn.f new file mode 100644 index 0000000..5fddb45 --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/filelist_syn.f @@ -0,0 +1,23 @@ +../../rtl/define/chip_define.v +../../sim/chip_top/TB.sv +../../model/spi_if.sv +../../model/DW01_addsub.v +../../model/DW02_mult.v +../../model/DW_mult_pipe.v +../../model/clk_gen.v +../../model/clock_tb.v +../../model/reset_tb.v +../../model/thermo2binary_top.v +../../model/thermo7_binary3.v +../../model/thermo15_binary4.v +../../model/glbl.v +../../rtl/memory/tsdn28hpcpuhdb128x128m4mw_170a_ffg0p99v0c.v +../../rtl/memory/tsdn28hpcpuhdb4096x32m4mw_170a_ffg0p99v0c.v +../../rtl/memory/tsdn28hpcpuhdb64x32m4mw_170a_ffg0p99v0c.v +../../rtl/memory/tsdn28hpcpuhdb512x128m4mwr_170a_ffg0p99v0c.v +../../rtl/memory/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v +../../rtl/dem/DEM_31MSB_decoder_1ch.v +../../rtl/dem/DEM_31MSB_decoder_16ch_XY.v +/data/pdk/TSMCHOME/digital/Front_End/verilog/tphn28hpcpgv18_110a/tphn28hpcpgv18.v +../../lib/tcbn28hpcplusbwp7t35p140.v +../../syn/current/outputs/xyz_chip_top.syn.v diff --git a/DA4008_V1.2/sim/chip_top/filelist_vlg.f b/DA4008_V1.2/sim/chip_top/filelist_vlg.f new file mode 100644 index 0000000..4fc7a44 --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/filelist_vlg.f @@ -0,0 +1,46 @@ +../../rtl/define/chip_define.v +../../lib/tphn28hpcpgv18.v +../../lib/tsdn28hpcpuhdb4096x128m4mw_170a_ffg0p99v0c.v +../../rtl/io/iopad.v +../../rtl/systemregfile/systemregfile.v +../../rtl/dacif/dacif.v +../../rtl/fifo/syn_fwft_fifo.v +../../rtl/dac_regfile/dac_regfile.v +../../rtl/lvds/ulink_rx.sv +../../rtl/rstgen/rst_gen_unit.v +../../rtl/rstgen/rst_sync.v +../../rtl/comm/sirv_gnrl_xchecker.v +../../rtl/comm/pulse_generator.sv +../../rtl/comm/sirv_gnrl_dffs.v +../../rtl/comm/syncer.v +../../rtl/comm/ramp_gen.v +../../rtl/memory/tsmc_dpram.v +../../rtl/memory/sram_if.sv +../../rtl/memory/sram_dmux.sv +../../rtl/memory/dpram.v +../../rtl/memory/bhv_spram.v +../../rtl/memory/spram.v +../../rtl/clk/clk_regfile.v +../../rtl/awg/awg_top.sv +../../rtl/awg/awg_ctrl.v +../../rtl/dem/DEM_PhaseSync_4008.sv +../../rtl/dem/DA4008_DEM_Parallel_PRBS_1CH.v +../../rtl/dem/DA4008_DEM_Parallel_PRBS_64CH.v +../../rtl/top/da4008_chip_top.sv +../../rtl/top/digital_top.sv +../../rtl/spi/spi_bus_decoder.sv +../../rtl/spi/spi_slave.v +../../rtl/spi/spi_pll.v +../../rtl/spi/spi_sys.v +../../model/clock_tb.v +../../model/spi_if.sv +../../model/clk_gen.v +../../model/DEM_Reverse_64CH.v +../../model/DEM_Reverse.v +../../model/reset_tb.v +../../model/DW_stream_sync.v +../../model/DW_reset_sync.v +../../model/DW_sync.v +../../model/DW_pulse_sync.v +../../sim/chip_top/TB.sv +../../rtl/define/chip_undefine.v diff --git a/DA4008_V1.2/sim/chip_top/regress.csh b/DA4008_V1.2/sim/chip_top/regress.csh new file mode 100644 index 0000000..f29471b --- /dev/null +++ b/DA4008_V1.2/sim/chip_top/regress.csh @@ -0,0 +1,166 @@ +#!/bin/csh + +# Set the directory to be processed (default is the current directory) +set case_dir = "../../case/config" + +# If a directory is provided as a parameter, use that directory. +#if ($#argv > 0) then +# set case_dir = $argv +#endif + +# Check if two directories and a log file are provided as parameters. +if ( $#argv != 1 ) then + echo "Usage: $0 SIM" + exit 1 +endif + +set SIM = $1 + +# Initialize Counter +set dir_count = 1 + +# List all directories, and print their sequence numbers. +echo "Listing directories in $case_dir :" +foreach dir (`ls -d $case_dir/*/`) +# set filelist = `basename $file .txt` + echo "$dir_count : $dir" +# echo "$count : $filelist" + @ dir_count++ +end + + +# Obtain the sequence number input by the user from the command line. +echo -n "Enter the start number: " +set start = $< +echo -n "Enter the end number: " +set end = $< +echo -n "Whether save sim files? 1: save; 0: delete." +echo -n "Enter your choice: " +set save = $< +if ("$save" == "") then + set save = 0 +endif + +make -s comp WAVE=$save + +if ( $start < 1 || $end > $dir_count - 1 || $start > $end ) then + echo "Invalid directory range. Please enter a valid range." + exit 1 +endif + +set selected_dirs = () +@ dir_index = 1 +foreach dir (`ls -d $case_dir/*/`) + if ( $dir_index >= $start && $dir_index <= $end ) then + set selected_dirs = ($selected_dirs $dir) + endif + @ dir_index++ +end + +foreach folder ($selected_dirs) + echo "Processing folder: $folder" + + # 获取文件夹中的所有 TXT 文件 + set file_list = ($folder/*.txt) + set txt_count = $#file_list + # 产生对应的文件夹地址 + set gather_folder = `echo $folder | sed 's|/config/|/gather/|'` + set result_folder = `echo $folder | sed 's|../../case/config/|result/|g'` + set coverage_folder = `echo $folder | sed 's|../../case/config/|coverage/|g'` + + # 打印 result_folder 的值 + echo "Result folder: $result_folder" + mkdir -p $gather_folder + # 检查是否有 TXT 文件 + if ( $#file_list == 0 ) then + echo "No .txt files found in $folder. Skipping..." + continue + endif + mkdir -p $result_folder + # TB从这些文件中读取case,result等文件的路径 + set temp_files = ("case_temp.txt" "data_temp.txt" "result_temp.txt") + # 遍历文件列表,检查是否存在,不存在则创建,这样git就不用追踪这些txt文件了 + foreach file ($temp_files) + if ( ! -e $file ) then + touch $file + endif + end + #遍历文件夹中的所有 TXT 文件 + @ i = 1 + foreach file ($file_list) + # echo "Processing file: $file" + # set file_list = ($case_dir/*.txt) + + set rstdir = "./data_$SIM" + mkdir -p $rstdir + + while ( $i <= $txt_count ) + set filename = `basename $file_list[$i] .txt` + set filen = `basename $file_list[$i]` + set dirname = `dirname $file_list[$i]` + # 拼接目标文件路径 + set gather_file = "$gather_folder/$filename.txt" + set result_file = "$result_folder/$filename.txt" + # 创建result等相关文件 + set file_lists = ($result_file) + # 遍历文件列表,检查并创建文件 + foreach file ($file_lists) + touch $file + echo "" > $file + # 输出创建文件的状态 + if ( $status == 0 ) then + echo "File $file created successfully." + else + echo "Failed to create file $file." + endif + end + # Create directories corresponding to filenames + set newdir = "./work_$SIM/$filename" + mkdir -p $newdir + # echo $status + if ( $status == 0 ) then + echo "Directory $newdir created successfully." + else + echo "Failed to create directory $newdir." + endif + # echo "Directory $newdir created." + # Copy the simv file to the corresponding folder. + echo "Copy the simv file to the $newdir folder." + \cp -f ./simv $newdir/ + \cp -rf simv.daidir $newdir/ + + \cp -f ./backup/Makefile $newdir/ + \cp -f ./backup/filelist_syn.f $newdir/ + \cp -f ./backup/filelist_vlg.f $newdir/ + + echo "" > ./case_temp.txt + echo "" > ./data_temp.txt + echo "" > ./result_temp.txt + echo " ../../$file_list[$i]" >> case_temp.txt + echo " ../../${result_file}" >> result_temp.txt + set result = "data_$SIM" + + set new_dir = `echo "$dirname" | sed 's|../../case/config|'$result'|'` + mkdir -p $new_dir + set result = "$new_dir/$filen" + touch $result + + echo "../../$result" >> data_temp.txt + cd $newdir/ + # Run "run" command in makefile + ./simv -l sim.log -cm line+cond+fsm+tgl+branch -cm_dir ../../$coverage_folder -cm_name $filename "+ENABLE_FSDB=$save" + cd ../../ + if ( $save == 0 ) then + rm -rf $newdir + endif + @ i++ + end + end +end + + + + + + + diff --git a/DA4008_V1.2/sim/lvds/Makefile b/DA4008_V1.2/sim/lvds/Makefile new file mode 100644 index 0000000..b1f80ac --- /dev/null +++ b/DA4008_V1.2/sim/lvds/Makefile @@ -0,0 +1,72 @@ + +WAVE ?= 0 + +SIM = RTL + +folder = simv + +ifeq ($(WAVE),1) + WAVE_OPTS = -debug_access+all -debug_region+cell+encrypt -P $(NOVAS_HOME)/share/PLI/VCS/linux64/novas_new_dumper.tab $(NOVAS_HOME)/share/PLI/VCS/linux64/pli.a +define+DUMP_FSDB + WAVE_SIM_OPTS = -fsdbDumpfile=sim.fsdb + else + WAVE_OPTS = -debug_access+pp +endif + +ifeq ($(SIM),PostPr) +VCS = vcs -full64 -sverilog -Mupdate +lint=TFIPC-L +v2k +warn=noSDFCOM_IWSBA,noNTCDNC -notice +mindelays +tchk+edge+warn +neg_tchk -negdelay +overlap +sdfverbose -sdfretain +optconfigfile+notimingcheck.cfg -override_timescale=1ns/1ps -debug_access+all $(WAVE_OPTS) -lca -q -l compile.log -cm line+cond+fsm+tgl+branch -cm_dir ./coverage/simv.vdb |tee +else +VCS = vcs -full64 -j8 -sverilog +lint=TFIPC-L +v2k $(WAVE_OPTS) -lca -q -timescale=1ns/1ps +nospecify -l compile.log -cm line+cond+fsm+tgl+branch -cm_dir ./coverage/simv.vdb +endif + +ifeq ($(SIM),PostPr) + post_dir = ./data_PostPr +else + post_dir = ./data_PostSyn +endif + + +ifeq ($(SIM),PostSyn) +FileList = filelist_syn.f +else + ifeq ($(SIM),PostPr) + FileList = filelist_pr.f + else + FileList = filelist_vlg.f + endif +endif + +SIMV = ./simv sync:busywait -Xdprof=timeline $(WAVE_SIM_OPTS) -l |tee sim.log + +all:comp run + +comp: + ${VCS} -f $(FileList) +incdir+./../../rtl/define +incdir+./../../rtl/qubitmcu +incdir+./../../model + +run: + ${SIMV} + +dbg: + verdi -sverilog -f $(FileList) -top TB -ssf *.fsdb -nologo & + +clean: + rm -rf DVE* simv* *log ucli.key verdiLog urgReport csrc novas.* *fsdb* *.dat *.daidir *.vdb *~ + +compare: + ./compare_files.csh ${post_dir} ./data_RTL ./compare.txt + +regress: + ./regress.csh $(SIM) + +rmwork: + rm -rf ./work* + +rmdata: + rm -rf ./data* +cov: + verdi -cov -covdir coverage/merged.vdb & +cov_d: + dve -full64 -covdir coverage/*.vdb & +merge: + urg -full64 -dbname coverage/merged.vdb -flex_merge union -dir coverage/simv.vdb -parallel -maxjobs 64& +merge_i: + urg -full64 -flex_merge union -dir coverage/merged.vdb -dir coverage/$(folder) -dbname coverage/merged.vdb -parallel -maxjobs 64& diff --git a/DA4008_V1.2/sim/lvds/TB.sv b/DA4008_V1.2/sim/lvds/TB.sv new file mode 100644 index 0000000..875d2ac --- /dev/null +++ b/DA4008_V1.2/sim/lvds/TB.sv @@ -0,0 +1,479 @@ +`timescale 1ns/1ps + +module TB; + + // ==================================================== + // Parameters + // ==================================================== + parameter FIFO_DEPTH = 64; + parameter SCRAMBLER_SEED = 32'hFFFFFFFF; + parameter CLK_PERIOD = 10; // 10ns + parameter PATN_COUNT = 20'd10; // Training match count + parameter TAP_STEP = 3'd3; // Delay adjustment step + + // ==================================================== + // Constants (moved to top for visibility) + // ==================================================== + localparam [31:0] TRAINING_PATN = 32'h68666E6C; // "hfnl" + localparam [31:0] TRAINING_EXIT = 32'h65786974; // "exit" + localparam [31:0] FRAME_HEADER = 32'hBCBCBCBC; + +initial begin + $fsdbAutoSwitchDumpfile(500, "./verdplus.fsdb", 1000000); + $fsdbDumpvars(); + $fsdbDumpMDA(); +end + + // ==================================================== + // Signals + // ==================================================== + logic clk; + logic rst_n; + logic [3:0] serial_in; + logic [19:0] patn_count; + logic [2:0] tap_step; + logic link_down; + logic [2:0] delay_tap; + logic [12:0] wr_addr; + logic [511:0] wr_data; + logic wr_en; + logic [63:0] byte_mask; + logic crc_error; + logic [2 :0] tap_adj_mask = 3'b111; // Delay adjustment mask + logic [0 :0] tap_force = 1'b0 ; // Delay force to tap_step + logic tap_adj_req ; + logic frame_done ; + logic [31 :0] train_status ; + logic [31 :0] frame_status ; + logic always_on = 1'b0 ; + logic prefilling ; + logic prefill_start; + + // Added for scrambler test + logic descram_en; + logic [31:0] lfsr_lane[0:3]; // 4 independent LFSRs for scrambling + logic train_ready; + logic force_train; // Force Training + // ==================================================== + // DUT Instance + // ==================================================== + ulink_rx #( + .FIFO_DEPTH ( FIFO_DEPTH ) + ,.SCRAMBLER_SEED ( SCRAMBLER_SEED ) + ) dut ( + .clk ( clk ) + ,.rst_n ( rst_n ) + ,.serial_in ( serial_in ) + ,.patn_count ( patn_count ) + ,.tap_step ( tap_step ) + ,.descram_en ( descram_en ) // now variable + ,.link_down ( link_down ) + ,.delay_tap ( delay_tap ) + ,.wr_addr ( wr_addr ) + ,.wr_data ( wr_data ) + ,.wr_en ( wr_en ) + ,.byte_mask ( byte_mask ) + ,.crc_error ( crc_error ) + ,.tap_adj_mask ( tap_adj_mask ) + ,.tap_force ( tap_force ) + ,.tap_adj_req ( tap_adj_req ) + ,.frame_done ( frame_done ) + ,.train_status ( train_status ) + ,.frame_status ( frame_status ) + ,.always_on ( always_on ) + ,.prefilling ( prefilling ) + ,.prefill_start ( prefill_start ) + ,.train_ready ( train_ready ) + ,.force_train ( force_train ) + ); + + // ==================================================== + // Clock Generation + // ==================================================== + initial begin + clk = 0; + forever #(CLK_PERIOD/2) clk = ~clk; + end + + // ==================================================== + // Tasks for Stimulus Generation + // ==================================================== + + // Reset task + task reset; + begin + rst_n = 0; + repeat(5) @(posedge clk); + rst_n = 1; + repeat(2) @(posedge clk); + end + endtask + + // Send one 128-bit block over 32 cycles + task send_block; + input [127:0] block; + begin + integer i; + for (i = 31; i >= 0; i = i - 1) begin + serial_in[0] = block[i]; + serial_in[1] = block[32 + i]; + serial_in[2] = block[64 + i]; + serial_in[3] = block[96 + i]; + @(posedge clk); + #0.1; + end + end + endtask + + // Send multiple identical blocks + task send_blocks; + input [127:0] block; + input integer count; + begin + repeat(count) send_block(block); + end + endtask + + // Send a sequence of 32-bit words (packed into 128-bit blocks) + task send_words; + input integer num_words; + input [31:0] words[0:255]; + begin + integer word_idx; + integer j; + reg [127:0] block; + word_idx = 0; + while (word_idx < num_words) begin + block = 128'h0; + for (j = 0; j < 4; j = j + 1) begin + if (word_idx < num_words) begin + block[32*j +: 32] = words[word_idx]; + word_idx = word_idx + 1; + end + end + send_block(block); + end + end + endtask + + // ==================================================== +// Scrambler tasks (used when descram_en=1) +// ==================================================== + +// Original scrambler (all lanes scrambled) +task scramble_block; + input [127:0] original; + output [127:0] scrambled; + integer i; + reg [31:0] lane_word; + begin + scrambled = 128'h0; + for (i = 0; i < 4; i = i + 1) begin + lane_word = original[32*i +: 32]; + scrambled[32*i +: 32] = lane_word ^ lfsr_lane[i]; + // Update LFSR: feedback = lfsr[31]^lfsr[30]^lfsr[29]^lfsr[28] + lfsr_lane[i] = {lfsr_lane[i][30:0], + lfsr_lane[i][31] ^ lfsr_lane[i][30] ^ + lfsr_lane[i][29] ^ lfsr_lane[i][28]}; + end + end +endtask + +// New scrambler with per-lane mask (1=scramble that lane) +task scramble_block_masked; + input [127:0] original; + input [3:0] mask; // 1=scramble this lane + output [127:0] scrambled; + integer i; + reg [31:0] lane_word; + begin + scrambled = 128'h0; + for (i = 0; i < 4; i = i + 1) begin + lane_word = original[32*i +: 32]; + if (mask[i]) begin + scrambled[32*i +: 32] = lane_word ^ lfsr_lane[i]; + // Update LFSR only for scrambled lanes + lfsr_lane[i] = {lfsr_lane[i][30:0], + lfsr_lane[i][31] ^ lfsr_lane[i][30] ^ + lfsr_lane[i][29] ^ lfsr_lane[i][28]}; + end else begin + scrambled[32*i +: 32] = lane_word; + // No LFSR update for unscrambled lanes + end + end + end +endtask + + // ==================================================== + // CRC32 Computation Functions + // ==================================================== + function automatic [31:0] crc32_next; + input [31:0] crc; + input [31:0] data; + reg [31:0] new_crc; + reg b; + integer i; + begin + new_crc = crc; + for (i = 0; i < 32; i = i + 1) begin + b = new_crc[31] ^ data[31-i]; + new_crc = {new_crc[30:0], 1'b0}; + if (b) new_crc = new_crc ^ 32'h04C11DB7; + end + crc32_next = new_crc; + end + endfunction + + function automatic [31:0] crc32_compute; + input [31:0] words[0:255]; + input integer num; + reg [31:0] crc; + integer i; + begin + crc = 32'hFFFFFFFF; + for (i = 0; i < num; i = i + 1) begin + crc = crc32_next(crc, words[i]); + end + crc32_compute = crc; + end + endfunction + + // ==================================================== + // Test Variables (module level) + // ==================================================== + integer data_words; + reg [31:0] frame_words[0:255]; + integer frame_len; + integer i; + // ==================================================== + // Test Sequence + // ==================================================== + initial begin + // Initialize + serial_in = 4'h0; + patn_count = PATN_COUNT; + tap_step = TAP_STEP; + descram_en = 0; // default disabled + force_train = 0; + + $display("========================================"); + $display("Testbench started at %0t", $time); + $display("========================================"); + + reset(); + wait(prefill_start == 1); + repeat(10) @(posedge clk); + prefilling = 1; + repeat(100) @(posedge clk); + prefilling = 0; + // ------------------------------------------------- + // Phase 1: Link Training (successful) + // ------------------------------------------------- + $display("Phase 1: Training with correct patterns..."); + + send_blocks({4{TRAINING_PATN}}, PATN_COUNT - 0); + send_blocks({4{TRAINING_EXIT}}, 1); + + wait(dut.u_train.train_ready == 1); + $display("Link ready at %0t", $time); + + // ------------------------------------------------- + // Phase 2: Send a correct frame + // ------------------------------------------------- + $display("Phase 2: Sending a correct frame..."); + + data_words = 20; + frame_len = 2 + data_words + 1; + + frame_words[0] = FRAME_HEADER; + frame_words[1] = (32'h1235 << 16) | data_words; + + for (i = 0; i < data_words; i = i + 1) begin + frame_words[2+i] = 32'hA0000000 + i; + end + + // Compute CRC over addr_len and data (1 + data_words words) + begin + reg [31:0] crc_tmp[0:255]; + integer k; + for (k = 0; k < 1 + data_words; k = k + 1) begin + crc_tmp[k] = frame_words[1 + k]; + end + frame_words[2 + data_words] = crc32_compute(crc_tmp, 1 + data_words); + end + + send_words(frame_len, frame_words); + + fork + begin + @(posedge wr_en); + $display("Write detected: addr=%0d data=%h mask=%h", wr_addr, wr_data, byte_mask); + if (wr_addr !== 13'h123) $error("Unexpected write address: %0d", wr_addr); + if (byte_mask[31:0] !== 32'hFFFF_0000) $error("Byte mask mismatch: %h", byte_mask); + if (byte_mask[63:32] !== 32'hFFFF_FFFF) $error("Byte mask high part not zero: %h", byte_mask[63:32]); + $display("Correct frame write verified."); + end + join_none + + repeat(100) @(posedge clk); + + // ------------------------------------------------- + // Phase 3: Send a frame with bad CRC + // ------------------------------------------------- + $display("Phase 3: Sending a frame with bad CRC..."); + + frame_words[2+data_words] = ~frame_words[2+data_words]; + send_words(frame_len, frame_words); + + @(posedge crc_error); + $display("CRC error detected at %0t", $time); + repeat(10) @(posedge clk); + if (link_down) $display("Link down as expected."); + else $error("Link not down after CRC error."); + + // ------------------------------------------------- + // Phase 4: Re-train and send another correct frame + // ------------------------------------------------- + $display("Phase 4: Re-training..."); + + send_blocks({4{TRAINING_PATN}}, PATN_COUNT - 0); + send_blocks({4{TRAINING_EXIT}}, 1); + + wait(dut.u_train.train_ready == 1); + $display("Link ready again."); + + // Compute CRC over addr_len and data (1 + data_words words) + begin + reg [31:0] crc_tmp[0:255]; + integer k; + for (k = 0; k < 1 + data_words; k = k + 1) begin + crc_tmp[k] = frame_words[1 + k]; + end + frame_words[2 + data_words] = crc32_compute(crc_tmp, 1 + data_words); + end + send_words(frame_len, frame_words); + + repeat(100) @(posedge clk); + + // ------------------------------------------------- + // Phase 5: Test delay_tap adjustment on match failure + // ------------------------------------------------- + $display("Phase 5: Testing delay_tap adjustment..."); + + force_train = 1; + repeat(1) @(posedge clk); + force_train = 0; + send_blocks(128'h0, 5); + repeat(200) @(posedge clk); + $display("Final delay_tap = %0d", delay_tap); + + // ------------------------------------------------- + // Phase 6: Test with scrambler enabled (header not scrambled) + // ------------------------------------------------- + $display("Phase 6: Testing with descrambler enabled (header not scrambled)..."); + + // Reset and train with descram_en=0 (training patterns are not scrambled) + descram_en = 0; + force_train = 1; + repeat(1) @(posedge clk); + force_train = 0; + send_blocks({4{TRAINING_PATN}}, PATN_COUNT - 0); + send_blocks({4{TRAINING_EXIT}}, 1); + + wait(dut.u_train.train_ready == 1); + $display("Link ready for scrambled data."); + + // Enable descrambler in DUT and initialize LFSRs for transmission + descram_en = 1; + for (i = 0; i < 4; i = i + 1) lfsr_lane[i] = SCRAMBLER_SEED; + + // Construct a simple frame (small data length) + data_words = 10; + frame_len = 2 + data_words + 1; + + frame_words[0] = FRAME_HEADER; + frame_words[1] = (32'h1234 << 16) | data_words; // base_addr=0x1234, offset=0, len=10 + + for (i = 0; i < data_words; i = i + 1) begin + frame_words[2+i] = 32'hB0000000 + i; // different pattern from Phase 2 + end + + // Compute CRC over addr_len and data (1 + data_words words) + begin + reg [31:0] crc_tmp[0:255]; + integer k; + for (k = 0; k < 1 + data_words; k = k + 1) begin + crc_tmp[k] = frame_words[1 + k]; + end + frame_words[2 + data_words] = crc32_compute(crc_tmp, 1 + data_words); + end + + // Now scramble each 128-bit block and send + begin + integer word_idx; + integer j; + integer block_num; + reg [127:0] orig_block, scrambled_block; + reg [3:0] block_mask; + word_idx = 0; + block_num = 0; + while (word_idx < frame_len) begin + orig_block = 128'h0; + // Fill block with up to 4 words, pad with 0 if needed + for (j = 0; j < 4; j = j + 1) begin + if (word_idx < frame_len) begin + orig_block[32*j +: 32] = frame_words[word_idx]; + word_idx = word_idx + 1; + end else begin + orig_block[32*j +: 32] = 32'h0; // pad with 0 + end + end + // Determine mask: first block leaves lane0 unscrambled (header), others all scrambled + block_mask = (block_num == 0) ? 4'b1110 : 4'b1111; + scramble_block_masked(orig_block, block_mask, scrambled_block); + send_block(scrambled_block); + block_num = block_num + 1; + end + end + + // Monitor writes + fork + begin + @(posedge wr_en); + $display("Scrambled test write: addr=%0d data=%h mask=%h", wr_addr, wr_data, byte_mask); + end + join_none + + repeat(200) @(posedge clk); + + // Check that no CRC error happened + if (crc_error) $error("CRC error in scrambled test"); + else $display("Scrambled test passed (no CRC error)."); + + // Disable scrambler for rest of test + descram_en = 0; + + // ------------------------------------------------- + // End of test + // ------------------------------------------------- + repeat(50) @(posedge clk); + $display("========================================"); + $display("Testbench finished at %0t", $time); + $display("========================================"); + $finish; + end + + // ==================================================== + // Monitor and Assertions + // ==================================================== + always @(posedge clk) begin + if (wr_en) $display("WRITE: addr=%0d data=%h mask=%h", wr_addr, wr_data, byte_mask); + if (crc_error) $display("CRC_ERROR pulse at %0t", $time); + end + + always @(posedge clk) begin + if (dut.u_train.train_ready && link_down) + $error("Inconsistent state: train_ready and link_down both high"); + end + +endmodule diff --git a/DA4008_V1.2/sim/lvds/filelist_vlg.f b/DA4008_V1.2/sim/lvds/filelist_vlg.f new file mode 100644 index 0000000..8b06f52 --- /dev/null +++ b/DA4008_V1.2/sim/lvds/filelist_vlg.f @@ -0,0 +1,7 @@ +../../rtl/comm/sirv_gnrl_xchecker.v +../../rtl/comm/sirv_gnrl_dffs.v +../../rtl/memory/spram.v +../../rtl/memory/bhv_spram.v +../../rtl/fifo/syn_fwft_fifo.v +../../rtl/lvds/ulink_rx.sv +../../sim/lvds/TB.sv