From 47606a4459cf25809c1fd1980d6398f4f8c7297d Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Tue, 17 Mar 2026 20:56:28 +0200 Subject: [PATCH] Rewrite integration testbench with golden self-reference comparison + physics bounds checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace smoke-test integration TB (10 liveness checks) with golden comparison architecture (18 checks). Two compile-time modes: - GOLDEN_GENERATE: dumps 2048 Doppler outputs to golden_doppler.mem - Default: loads golden, compares within ±2 LSB tolerance per channel New checks: G1 golden comparison (2048/2048 exact match verified), B1a/b DDC energy bounds, B2a/b Doppler per-bin energy, B3 exact count, B4 full 64x32 bin coverage, B5 no duplicate indices. Fault injection verified: zeroing FIR coeff[15] causes 2048/2048 golden mismatches (max err 1234/1443 LSB), confirming regression guard. --- .../9_2_FPGA/tb/golden/golden_doppler.mem | 2176 +++++++++++++++++ .../9_2_FPGA/tb/tb_radar_receiver_final.v | 390 ++- 2 files changed, 2528 insertions(+), 38 deletions(-) create mode 100644 9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem diff --git a/9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem b/9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem new file mode 100644 index 0000000..6c32f0f --- /dev/null +++ b/9_Firmware/9_2_FPGA/tb/golden/golden_doppler.mem @@ -0,0 +1,2176 @@ +// 0x00000000 +0005fdb8 +ff5a02a0 +0021ff0d +fffeffdf +00a1fef3 +ff6c01ac +ff85ff08 +0230022d +fd7afca5 +00550282 +00dbfe37 +ffc20177 +ff1dfe28 +0086022e +0006fd62 +004601b0 +// 0x00000010 +0245002a +fb84ff76 +025b002f +ff9c005b +ff4fff81 +fefc00c0 +01bdfee8 +ff8e01e1 +00c0fe31 +009d0024 +fe1501c1 +0134ff53 +0077fff4 +ff7aff9a +ff7400a2 +0104ffde +// 0x00000020 +00ca016d +ff25ff70 +002c004d +ffccff91 +013900bd +fed5ffb4 +004f0095 +ffcd0084 +006aff27 +ffbaffb0 +0052002b +0146016b +fca5fcf0 +031b023d +ff43ff54 +fffc00df +// 0x00000030 +0074fec1 +ff1f005c +00100019 +ffc20055 +008dfe1d +fe710300 +0213fe31 +ff1b0064 +0090ff53 +001e019c +ff2afe2b +0004013b +00cdffa6 +ff43fff7 +00e30092 +fed4fe2d +// 0x00000040 +ffeeff37 +001700d0 +00c1ff66 +fea0012e +0177feaf +fee501f9 +016dfe73 +fe3d019e +0168fe16 +ff6c0108 +00ffff69 +fed8ffbb +0040ff97 +006200e7 +00cdff5a +fdb00017 +// 0x00000050 +01f20169 +ff07fe0e +ffdd0086 +ff48ffcc +015f008f +ff3f017f +ffe7fd23 +0081017a +000c001a +00baff9e +fe1fff9f +0154017b +ffa6fefb +ff66ffc5 +0123014c +ff3eff29 +// 0x00000060 +00c5ff43 +0045ff45 +ff6a00c3 +fff100e0 +00c3ffab +ffbeff4f +ff5e0123 +00c5ffcf +ffd5ffc8 +ff91ffed +00faff96 +fed6018b +0058fc7e +00bc0388 +ffe2fe1c +ff140191 +// 0x00000070 +01b9fea5 +fe95011b +ffdcfee7 +0049004e +00370035 +ff96016f +00c6fd91 +ff3300e9 +02310050 +fdc1ff83 +0138fef0 +feac021f +01bafeca +fdc4fffa +02120028 +fe18007f +// 0x00000080 +ff5bfff7 +007a0136 +ffc1fe00 +ffb9027b +0170fd3c +fe200276 +013efdb6 +007c0132 +ffa7ff99 +fef4012a +010bfe61 +ff41006b +ffab0049 +ff44ff78 +0171009f +ff800075 +// 0x00000090 +018fff4d +fd1eff42 +019101ae +fff3ff71 +0084ffac +fd8a0158 +02a0ff16 +ff4e0078 +002fff6b +ffe0ff32 +008701f5 +ffabff29 +ff41fec7 +0146010e +000d00b1 +ff9efed9 +// 0x000000a0 +0135fdaa +feae0191 +ff93fec6 +018b005a +ff350023 +ff520011 +0047ffc1 +00bfffe6 +007ffff9 +fe21006c +01bbff64 +ff3a017e +ffd7fe52 +feec0082 +018cffe8 +ffd20152 +// 0x000000b0 +ff2dfcb8 +008c0345 +006dfd88 +fe8501d4 +0151fee1 +ff460209 +ff97ff01 +00530080 +00f7fead +fead017e +01d1ff2e +fd760098 +0313ff7a +fe9c0004 +0122fffe +fed40144 +// 0x000000c0 +01b0fef1 +fe6b0216 +00dbfdd4 +ffe300d4 +0125ffb3 +fdd300d4 +00e1ffe0 +0104ffe3 +ff17fea4 +ff2e0118 +0167ff73 +ff21004e +fedfffc6 +01caff79 +ffc40154 +ff91007f +// 0x000000d0 +008efead +feb50040 +0107ffc8 +ff6f011e +ffe5fed3 +0117ffda +fe350084 +01b600ad +ff0ffe6a +009201fe +fed3fea1 +010501e8 +007bfdd0 +fdc4010d +03520100 +fdd5fef9 +// 0x000000e0 +ffccffa2 +00160196 +ff86fd7e +00b40123 +006dffad +fed80104 +0030fea2 +0135031a +ff7ffbfb +ff0c0258 +012fff50 +fe9f008e +0180fedd +feb10000 +01d1012b +ff5eff5e +// 0x000000f0 +0034ff88 +fe72ffae +01e20088 +fedc0067 +0025ff37 +fea00044 +0178fff4 +fff3ffd4 +fec5ffeb +01c0000c +fe3d012a +00b1ff1c +0012006f +003bfff8 +ff8b010f +00a2ff08 +// 0x00000100 +0110fecc +fefa0220 +009dfe0b +0065012d +fed8ff24 +00fb0176 +ff73fe45 +00eb0323 +feebfd0b +0068fff7 +ff660026 +00fe00ea +fef8fde8 +00390205 +0148ff28 +fd8a00db +// 0x00000110 +02b0ffc6 +fd04ff1e +01f90045 +fe590251 +01e2fd2a +fd8d012e +02b90047 +ff33001b +ffd9ff67 +ffc2ffff +002400f6 +00d8ff30 +ff8affc6 +fff7013b +ffbcffd0 +ffd4ff47 +// 0x00000120 +0167008e +ff220031 +ff42ff5f +0121013b +0073ff78 +ff020112 +fff1fe5d +00ed034c +ff30fcd7 +fffd00c5 +004bff4d +00bf01a9 +ff68fe6d +ff62ffda +018600d5 +ff6b010f +// 0x00000130 +010bfe7a +fdda0083 +0104ffdb +ff430065 +0139fde4 +fe60037c +021bfd5d +fec100f4 +00aaff1d +00affff3 +fe770121 +00f5ff77 +ff60ffd3 +ff840044 +00760011 +ff0ffef9 +// 0x00000140 +00caff33 +ff9e0000 +001effed +ffc101e2 +0103fe19 +feb000d8 +0039ff72 +00ee019b +ffc9fd6a +fef2020e +000cfeda +00d1001f +ff60ff04 +ff9601f2 +00a1ff3a +00070125 +// 0x00000150 +01e4ff87 +fbbaff6a +032e0061 +ff030080 +0085ff85 +fe60ff76 +031300f6 +fe50ffd1 +007dff5c +0146ffcc +fdd40110 +00dbff87 +fffcff4e +ff72009c +014fff26 +fe6300d7 +// 0x00000160 +0222002c +fe19ff22 +00620117 +0032ff8f +016d005f +fdc4fef0 +00d10159 +ffe2ffcf +0094fecc +ff2900a0 +00acffc4 +ffa1011e +ff3afdd4 +00d300eb +ffa40062 +00530094 +// 0x00000170 +007aff62 +fed9ffd6 +ffb600d5 +0098ffb9 +ffc7feab +ff7a039e +0193fcc3 +ff020111 +01dcffbe +fe2100c4 +0114fe98 +ff4d019a +007eff3a +fecb002b +01e8ff9a +fe39fffc +// 0x00000180 +ffd50044 +ff610009 +fff300bf +0014fe91 +015100e9 +fe3dffe8 +00d50026 +fff400c5 +006aff0e +fed7ff93 +00e3ffd8 +00d6028d +fd14fb70 +01ea035f +fff3fec3 +ff250118 +// 0x00000190 +01d3fec2 +fdab0045 +019f00e7 +fed2ffeb +0135fead +fd1f02b8 +03e3fe36 +fd580051 +01a6ffbc +ff35003b +00d7ffda +ff6800eb +00b6fee2 +ff7200dd +00710071 +002bfe46 +// 0x000001a0 +0036ff7d +fe11fff9 +0124ffe0 +ff6200f5 +01c5ff05 +fdee01a4 +0139fe3d +ff340281 +01b3fd9b +fe430024 +00c2011a +0068ffbf +ff9efe0b +ff1f01b3 +022fffd4 +fe940010 +// 0x000001b0 +006200e1 +ff0dfd9d +00fc01aa +ff88ffdb +fff9ff41 +fef200c6 +027d0039 +fe14ff6d +0135ff27 +00170142 +feb6ff80 +00ae0081 +ff94ff37 +00e90127 +fe03fe6a +01d40132 +// 0x000001c0 +01e0fea8 +fe92ff9f +008c01f7 +ff50fda4 +00810145 +ffc8007a +ffaffe2c +ffa401cb +0158fe5c +feb30125 +0017ffd2 +007bff46 +ff6c01b5 +000cff33 +00b3ff68 +ffa20105 +// 0x000001d0 +fee200aa +018cff6f +ff90fe3d +ffc601cc +00cdffa5 +ff6000cc +0101fe40 +feb2022f +01c6fd62 +feef02b5 +ff65fd22 +ffff01e2 +0056ff41 +005c0077 +0045ffa4 +fef80101 +// 0x000001e0 +0093ff8d +ff65ff00 +015501c1 +fe53ff4b +018afff1 +002b002d +ff0eff8b +00ce0390 +0000fa0a +ff7003a5 +ffaafef6 +00200028 +00e9fda0 +ff5b035c +003ffe10 +ff530167 +// 0x000001f0 +0153ffc3 +fe49ff3e +01c30025 +fe950091 +00bcff9f +fe930017 +01defea9 +fec2016a +017aff62 +fe9a00a5 +ffb2fe9c +00600180 +00390054 +ffa7ff50 +006900e4 +ff6dffc3 +// 0x00000200 +00920036 +ff450067 +00e9ffb2 +fe69ffef +01c30023 +fee00002 +ff56ff5c +031202da +fceafceb +004a0168 +00cdfec4 +000c0122 +ffcffee4 +fef30016 +02200078 +fdf70118 +// 0x00000210 +02b6fd48 +fc1f0209 +02d50036 +fdfffeeb +00750093 +fee6007e +022cff24 +ff0a0180 +005afe8f +008e0194 +ff25ff4c +0070ffec +0095007e +fffbff7e +ffd60110 +ffc9fe16 +// 0x00000220 +ffc3ffcc +00930013 +fef700b7 +ff5cffbb +0201ff90 +fe6b0094 +00820079 +ff080000 +024ffefd +fd1f0153 +01eefeec +00370034 +ffd60068 +fee2ff93 +01970059 +ffd1ffb3 +// 0x00000230 +008700ea +fe09fd1b +018b0355 +fef4fe07 +0021ffae +feff017a +026aff41 +fe82ffcc +00cf00dd +ff45fecf +007000ac +00110096 +ffc8ff8a +ff94ffef +ffd5ffe9 +00cdffb5 +// 0x00000240 +ffc30035 +00dffff8 +fe61ffa8 +014600f7 +ff9aff5e +ffe7007d +ffaafed2 +00fd0282 +fef9fd7a +004f012a +fffdff1b +003101a1 +ff02fd56 +010501a6 +fff5fff4 +feea014d +// 0x00000250 +022dfefd +fd5bff08 +01cb01f6 +fef4ff53 +00f2fe88 +fe8d0337 +01b2fd2e +003700f4 +002bff6c +feff00d6 +005fff6f +00410039 +ff86ffac +ffb7008e +010fffa4 +ff6eff71 +// 0x00000260 +fec1fda5 +012a015f +fea2feb0 +0209016b +fef9ff33 +ffa6000b +ffcfffff +015e00e1 +ff68fe67 +fec6007c +01500042 +ff95ffe1 +fee8fdd7 +018102a8 +ff9fffb6 +ff190056 +// 0x00000270 +003ffecf +00b40119 +feb0007c +0109febf +fedd002d +00f60163 +0051ff7d +0110fe7d +fe6401f1 +0180fe64 +fe2e016a +0155ff15 +fe660025 +012f00e2 +0021fdbe +006d02ec +// 0x00000280 +00a9fe50 +ff3f01f2 +ff28fe73 +01ce0169 +ff5efe68 +ffe50163 +0031ffd1 +00f3ff41 +ffe500fa +fe5dff0a +02250028 +ff5800ce +fe5efdcd +004f01ae +01affe59 +fdd5028f +// 0x00000290 +02c7fd00 +fccd02a4 +01dcfe01 +fefc016b +00b2ff04 +ff7d025b +0019fe89 +ff83ffed +019b0026 +fe8ffed0 +009f0154 +ff6affea +01eaff5f +fe0f00c4 +00d70035 +ff910037 +// 0x000002a0 +0143fdff +ff56008b +ff47007a +00faffe0 +ff1aff44 +00ba01d1 +fe9afeaa +01d10024 +fff50039 +fe9fff65 +00efffb6 +004501b5 +ffe0fd6d +fed8024a +01b1fe94 +ff990188 +// 0x000002b0 +fffbfd75 +fe6c02bb +00ebfd6a +ffb40182 +005eff32 +ff7600f7 +00a6fff2 +ff7dffd4 +00b50063 +ff27ff21 +015f0176 +fed9ffd1 +ffb0ff0d +00d0006a +000fff10 +ff7d0200 +// 0x000002c0 +0213fe4c +fe3901d0 +00b1fe40 +ff98007b +01c3ffcc +fdaa0034 +0070000f +011000fa +ffb1fe61 +feec007c +0153006c +fe3f004d +002fffc0 +0015fee7 +00fb0156 +ffe400c0 +// 0x000002d0 +ff63fd70 +00ad0210 +ffd7fff6 +0072007d +fecdfea8 +00c2017a +ffbcfe9d +00860072 +ff71ff73 +00560154 +0051fe22 +ff170193 +01a9ff04 +fe07013b +027dfff2 +fda6fffc +// 0x000002e0 +006e011e +fe7b0069 +01b7fefa +ff9d00d9 +006cffe1 +fe400095 +019bffc9 +002100ce +ff7dfdb3 +002301b3 +006fff15 +ff46004d +ff9bff3e +017b00c1 +ffb0ffe5 +ff530036 +// 0x000002f0 +0024ff24 +feeb00cf +01e5ff56 +fe81014b +0072fe77 +ffde01cf +000dfda9 +fffd021a +0105fe13 +feff0235 +0015fe43 +ff74012b +017bfeb2 +fe3f00cb +00e00251 +fff7fc96 +// 0x00000300 +00a3fff3 +ffb200ee +0027fe63 +00a501e0 +fef2fe8d +007e00dd +ff89ff27 +016b01a5 +fe78fd0d +ff3202e9 +0210fd5f +fe160125 +018bffc4 +fed2014c +ffeafe77 +00ad0110 +// 0x00000310 +01c3fedf +fc720160 +01b3fe7b +ff7701ea +000cfeb5 +ff30ff55 +012501c9 +0081fedf +feda00cd +004aff65 +00ca0193 +ff7eff05 +ffe7ff66 +ff6000ce +01cc0121 +fef7fe20 +// 0x00000320 +fff2002b +0050006c +ffabffa9 +ff89013d +014cfdd4 +001e01fe +fe90ff16 +0083019a +0106fd55 +fe8f0196 +0022fed0 +014300e4 +ffb5ffa3 +fe5d0069 +0168ff11 +ffc00194 +// 0x00000330 +013aff0f +fd5cffba +028300bd +fe830041 +0026fda0 +ffe80388 +0110fd46 +ff530104 +008eff41 +ff41ffe4 +fffc007e +0011001a +ffe10059 +ffb1ff79 +ffc4015f +009afe8a +// 0x00000340 +00cfff41 +ff330087 +01120018 +ff0e001d +00a4ff56 +ff3101d2 +004dfed8 +008a003e +fec4fef7 +011a01d5 +fef8fe0f +00bb0157 +fefffe33 +01340186 +ff8bffc7 +ff5500fc +// 0x00000350 +015fff57 +fe790087 +008afe56 +ffb00265 +0130fe5c +fe31022e +01fbfd0c +ff1a0240 +016afebd +feae0055 +0064ff4b +00ef0247 +ff21fd8f +febe00e2 +0285009d +fe37fef6 +// 0x00000360 +019a0142 +fee0fece +fff500cc +ffa50005 +01a2ff5a +fef400b4 +000bffbc +00f200d2 +fe91fe36 +00e800cd +ff870053 +005b009e +fe28fd79 +018f0251 +ffadff5d +ffe900a6 +// 0x00000370 +019cfecc +fd20015a +0231ff52 +ff0d0099 +00a4fec8 +fef00332 +013dfcbc +ff7e018c +00ddff30 +ff500063 +002ffe2f +006f0298 +005efe89 +fe250011 +01af0113 +fe6bfe68 +// 0x00000380 +018c000a +fef00042 +ff69ff76 +01820094 +0070ff57 +fe8000f3 +ffddff05 +01a70218 +fe83fd12 +00830170 +0042ff6b +00800131 +fde7fdde +00b4007b +01ad00fb +fe900065 +// 0x00000390 +01a4fe0a +fd360116 +01570040 +ff3e002e +00a2feb3 +fde601c7 +025dff9f +ff8bffaa +00650026 +fff300f8 +feeafec7 +01800151 +ffb7ff5c +ff22ffe3 +02050079 +fe06ff2d +// 0x000003a0 +0024ff03 +ffa90124 +ff47fef7 +016000a3 +00b4ff4e +fe5a0168 +007afe4f +ffde0136 +0165fecb +fded0068 +00e8ff18 +00cd025a +fdaffce3 +00f901aa +01600040 +fea10053 +// 0x000003b0 +0128ff57 +fe43ffb4 +018d0049 +fe880069 +019cff24 +fd1e00f8 +02daffbb +ff3eff8c +0017fffb +00270070 +ff88ffb4 +ff3b00ea +00b9ff9b +008fffe6 +feb8ffca +012300cb +// 0x000003c0 +00aeffdf +0009ffef +001b00b7 +feb2febf +0142002b +ff580086 +007aff2e +0022004f +0070ff4a +ff160125 +003dfe69 +fff0010e +fede0071 +018b008b +ff18fdfb +ff6c0157 +// 0x000003d0 +0086ff81 +0023ffef +00a9ffb7 +ff3400ed +00a0ff91 +ff020206 +0112fc34 +fe78031f +0214ff22 +fe12ffd9 +00cbff0d +ff2e01b2 +0108fe8f +0047006d +ffb001c7 +ffd6fedf +// 0x000003e0 +00a0fc79 +fe8a012d +02510087 +fd8a0096 +0216fee4 +fe8b007e +0127ff38 +fef5018e +01dafe78 +fd7bfff1 +016200a4 +ffc5ff5b +ff4fffe3 +01500052 +ff70005f +ff79ff82 +// 0x000003f0 +010e00c9 +ff3cfee7 +ffa900ab +0052ff4c +007c00d2 +fe9b0046 +006dfddc +00f701c8 +ffe8ff6a +ff670113 +ffb4fe0a +ffeb0233 +ffcfff23 +0122008a +fe3cff3d +015f0290 +// 0x00000400 +fe92ff95 +ffd7001e +0107ff78 +ff2d018c +009afd6d +ffdd01fa +fef2ff32 +0199022a +fde3fd31 +019900a0 +ff6500de +003bffc0 +fff9fe8f +ff930204 +004bfe68 +ffe90173 +// 0x00000410 +02b8fe23 +fac301fc +0323ff38 +ffa9ff7a +ff040033 +fed10206 +0246fde6 +ff9f011e +00c7fe7b +ffd10152 +fed50082 +0127ffc6 +ffc5ffa5 +ffbb0040 +ffd9ff78 +01970029 +// 0x00000420 +01e200e7 +fedfffd0 +0065005a +ffd2ff1d +00ba0117 +fe9600fc +0093fec4 +006f00e5 +ff1cff62 +00f9ffa1 +ff850062 +01000097 +fe5dff15 +0123ff4e +007d018b +ff2e0050 +// 0x00000430 +015afe99 +fde30062 +01330010 +ff740027 +0046fec1 +fed40258 +01d3fe40 +feef00dd +00e8ff0e +ffa100b9 +ff97ffe4 +011600e1 +ff4bfe9b +feef00f2 +02910039 +fd30fe22 +// 0x00000440 +ff5300dc +fff6ff81 +00210131 +005afe7d +001400fc +ff600087 +0002ffd3 +009d00c2 +ff39fec1 +011dffb8 +ff7d0150 +0120fe85 +fd3700a8 +0379ff05 +fe35017b +fffeff55 +// 0x00000450 +0037ffba +00560027 +fe79ffd7 +011a002f +ff9cff76 +ff8e01b1 +0078fe27 +006b00d8 +00010039 +004bff74 +fe090054 +0294005b +fe6dffde +fff5ff67 +00f901c7 +ffe2fd9d +// 0x00000460 +00f40015 +ff16ff2f +fff4000a +ffb60092 +018afff0 +fe23ffe3 +006d0036 +012a004e +fe4aff26 +010300b4 +ff8fffdd +00c8015e +fe50fd5e +0109010a +00a40095 +fec70053 +// 0x00000470 +01dcfe5b +fde8019d +0104ff5a +00140056 +ffa8ff2a +fe830275 +027dfdb8 +feb400f6 +01a2ff4a +fee30118 +0029feab +fffe00ce +00caffa8 +fe9d0036 +01caffe1 +fe8bffd5 +// 0x00000480 +00df0078 +fe87ffd6 +0058fffa +000d0112 +00dcfe7c +ff0300d2 +ff7fff6e +013a00d2 +005ffecb +ff1500e6 +0030fff7 +00420009 +ffc0ff82 +fe9f0016 +01a70041 +ff35ffdf +// 0x00000490 +01cdff68 +fc1b00a4 +035cff60 +ff0d00fa +003efee0 +fda302d0 +0359fe14 +fdce004c +01250029 +003dfeac +ff6801e3 +0004feef +0086ffd6 +002ffff4 +ff8501e1 +001bfde7 +// 0x000004a0 +00f90044 +ff2400c9 +ffcbff38 +002bffdf +00f10064 +fe5dfffc +007eff41 +01000101 +001aff09 +fea20040 +0108ff9f +008d015b +fde6fdf8 +0087016a +00b3ffb2 +ff0f00a7 +// 0x000004b0 +0091feb8 +ff0c0021 +0137008c +ff7700dd +0049fdbc +ff3504b2 +017efc4b +feea0139 +00d0ff4b +ff4a0096 +00c6ffbd +feb10055 +01ccfeb0 +fefb00b8 +0101017a +ff17fe33 +// 0x000004c0 +0055fdbe +000101a1 +ff3afdf6 +00e6005e +ffbc0128 +0003002a +feb6fe7b +01f401ca +fed8fe5d +ff560124 +00dafea6 +ff3101ca +ffd9fe17 +00bc01ab +0150ff5f +fe2100d0 +// 0x000004d0 +00b7fea6 +ffb5019f +00f4fe64 +fde80142 +01d2ff7c +fe4dffe0 +0178000f +ffa8ffa2 +ff8000f3 +0188ffac +ffb00028 +fe31ffb6 +01950139 +0018fee3 +ff9aff37 +002b020c +// 0x000004e0 +003d0051 +00080016 +ff6800fd +012bfde0 +001a01d6 +ff5cff24 +fede0106 +0229ff06 +ff29ffda +001900a9 +ff32ffae +010bff2e +fe5b01c1 +0220fdcd +fea901d6 +0126ffb8 +// 0x000004f0 +ff1dff17 +00580018 +00120013 +ffa100de +005cfed8 +feea0148 +007afe08 +00dd019c +ff41ff4e +0003ff3d +ff60014a +007d000c +007b0009 +fee6fe93 +00b303dc +ffe8fcfe +// 0x00000500 +0058feac +ffa101ee +00c4fc74 +000a02df +009fff22 +fdd700fa +0240fe29 +ff5f0347 +ffc9fd42 +ff85009d +009dff6b +ffc70076 +ff9eff76 +00bb006a +0091ff85 +fecd004f +// 0x00000510 +02200028 +fc1bfeb8 +0296017a +fe5a001b +016bfee2 +fced00fc +035a008d +feedfeff +ff930012 +015f0021 +ff090143 +00e9ff6c +ff1cfee6 +000101ac +010dff21 +fee3009f +// 0x00000520 +0106001f +0058008d +fe840014 +00a0ffa9 +00c10049 +ff080081 +00a8ff0d +ffa402cd +0084fd4a +fec40162 +012ffdaa +00ae034c +fed1fcd7 +000501e0 +00effedf +ffaa01c9 +// 0x00000530 +012efe4d +fdce0049 +01160074 +feee000d +0183fe23 +fdb40293 +02f6fec7 +fdc20049 +0198ff3a +ff2e009c +002fffda +001800aa +ffebfee5 +ff1f0180 +01abff49 +fe24ff0d +// 0x00000540 +ff370033 +002fff9c +ffd7ff44 +ffd90224 +00f7fee3 +fe81003f +0049ff72 +000300ed +01a6fe91 +fde8015a +0084fe62 +011f022f +fe9bfd91 +007102b8 +ffc3fe2b +0039019a +// 0x00000550 +01a7ff4f +fc87feda +02f50158 +fe8f001a +00bffe79 +fed1021f +02d3fe94 +fd8d00bd +01f4ff0d +ff12006c +0004003e +fec9ffff +0137fedb +001500a6 +feddffdb +014f0028 +// 0x00000560 +fff7ffa8 +fff90098 +ff6cfe28 +01950292 +ff93fee1 +fefa00ce +0087fed7 +ffe00248 +00eafe42 +fe8f004f +0107ff2e +002b0111 +fe9fff52 +000cff90 +01de0147 +fe09ffcf +// 0x00000570 +02bbff6c +fcdf0064 +01e60176 +fec9fe24 +0121ffdf +fea20260 +01fdfdf5 +feaeff98 +016400c2 +ff65ff2d +ffeb00c0 +0027ffad +ff950096 +ffd4ff3a +00e20081 +ff01ff8d +// 0x00000580 +006000c9 +ff78ffc6 +ff8dffd6 +0011ff67 +019f0040 +fdd50128 +00bbfdc2 +00950219 +005efe7a +fe5e01aa +00b0fe3b +013e0271 +fcecfc9a +01e90248 +002bff6d +ff3c008e +// 0x00000590 +01e2ff01 +fd260004 +023900f2 +fe59ff7b +0115ff94 +fe070220 +02cdfeb2 +fe01006d +00d4ffa4 +0028ff58 +fffa0105 +00a00039 +ff44ff7a +005fff9c +00a50157 +ff7efe58 +// 0x000005a0 +01af0077 +fd6cfe55 +003a0186 +00aeff6e +0091ff4b +fe4201c6 +0143fdde +00520268 +ffd6fdee +003b00e3 +ff93ffec +010e0167 +feddfcce +ff7e02e5 +01cffea3 +fea5003f +// 0x000005b0 +00f9ffad +fef8ffc3 +0124ff60 +fe6a00ac +01810057 +fdacff60 +03190100 +fcee0068 +0202feca +ff75006d +ff8bfff2 +fff60073 +0019ff94 +0168005d +ff11feab +ffd7015d +// 0x000005c0 +007dff24 +fe37ffca +0199ffdb +ffcb01b5 +0068fd82 +fee50294 +017afdfc +fdc0023c +02f9fd4f +fd7300e5 +00fdffe8 +fff80040 +0002ffc5 +fed3ffd4 +025600c6 +feeb0017 +// 0x000005d0 +ffeffe46 +ff330134 +01dd0057 +fdbfff35 +017e0066 +ff71005a +ff80ff58 +ffeaff90 +01a3ffbf +fecb01bd +ffb9feba +0066009e +ff40007b +0167ff16 +fd840152 +021bfffd +// 0x000005e0 +00bfff65 +feed010b +01acff34 +fdfa0183 +024efe08 +fe86020e +005efe0f +00780310 +ff9dfbc8 +ff680208 +0126009b +fec0fe62 +010eff6e +ff1e0173 +01480040 +fe10ffa7 +// 0x000005f0 +020bffab +fde10043 +018e0074 +ff42fed1 +ff860074 +007c01a2 +0010fcf9 +00c00200 +ff0dff8c +ffe20072 +0014fe89 +008801c6 +ff1affca +0050ffcd +00060154 +000cfe95 +// 0x00000600 +00aa00f5 +ff0700fe +00c6ff21 +fece0010 +011cffa9 +ffb501bc +ffd9fdca +009f02db +ff52fd20 +001501ae +ffbeff0c +0082ffcf +ffa50091 +ff4eff61 +00abff85 +0050026f +// 0x00000610 +01f0fdc5 +fc1b00f2 +017effd7 +ffca0046 +00d6ff63 +fd410084 +02c3ff8a +fe9d015f +0174fe8e +ff39001e +00ca01e8 +fefeff1b +00c90013 +ffe4feeb +003d0293 +ffb4fc5f +// 0x00000620 +01c5ff35 +fe13009e +014f0155 +fe2dfdb5 +023200fc +fe310183 +019efe83 +fdf900e3 +01c70072 +ff25fead +ffd0005b +01c100b3 +fe95ff2b +00650002 +006200f1 +0016ff13 +// 0x00000630 +ffef0051 +ffd9ff2e +ffa7007f +ffc30053 +00cafedc +fdab00ff +028eff95 +ff6d0173 +0031fdd0 +ff03013f +0116ffb1 +ffcb00b1 +ff6bfed5 +007301bc +003efe97 +fef00013 +// 0x00000640 +00d4015d +ff5cff09 +0019ffcf +fff800d1 +00da0015 +fe90001d +0133fe78 +ff740229 +fff9fe99 +ff7b00c0 +004afec6 +005500db +fe15fece +024101b9 +ff7eff26 +fe850111 +// 0x00000650 +0240ff59 +feae0005 +00d90085 +fdda0027 +01c6feeb +ff0801bd +0241fe8a +fd86005f +0253011d +ff5ffe9e +ffb0ff9a +ffcd0109 +00d30086 +ff8bfe69 +001a0194 +ff65fdf3 +// 0x00000660 +ff1bfd4c +004b0279 +ff72fdb8 +02470246 +fe02fe54 +ffc1019a +0126fe76 +ff820208 +0189fcaf +fc470253 +034cff3b +fe7effc3 +fffcfea5 +ff95023c +01c9ffb6 +fd8e0095 +// 0x00000670 +0175feb4 +ff850089 +000e008e +ffa3ff72 +008e0002 +ff3d013a +0158fe92 +ff4c0004 +00f3014d +ff09fe7b +00600053 +ffb40169 +00c8fe89 +fe9d00a8 +00fdff3e +006801a3 +// 0x00000680 +0030fef0 +00ca0138 +fdebff28 +025e00ce +feffff62 +ff810013 +ffdb0034 +0181000d +ffb50041 +fddbff39 +0196ff49 +00c401cc +fdf0fdd4 +011401e5 +ff9efe7f +fff2020f +// 0x00000690 +01a0fd54 +fd7802b6 +0107ff34 +ffaeffd6 +ffedff3c +ff7f01f1 +0253ff1a +fe4dffcd +00d30027 +ff4bff01 +0170017b +fe70ffe4 +00ecff22 +ff5c00ff +006cff93 +ffd8fff3 +// 0x000006a0 +00e8fe62 +ff21014c +fe76fe6a +031c01bc +fdb4fe9b +00ee01e1 +0006fd1c +00570235 +0056fede +feaf0011 +010afff4 +ffdd012d +ffeefe2a +fe0e00c4 +0265ffe5 +fe7e013f +// 0x000006b0 +0152fdb4 +fec3017c +003cff6c +000a00ce +0086fefd +fee8013f +007a009c +00a5feef +0010ffb4 +ff3d0047 +011c00be +fec5ff35 +0050ffae +006c0064 +007bff83 +ff4e0189 +// 0x000006c0 +00d8ff4f +fe9200ed +ffeaff10 +00b90028 +00f8006e +fe950123 +005cfdff +00fb0323 +0029fc86 +fee70155 +00d6ffed +ffd800d9 +ff6dfde5 +fefd00c2 +030200fe +fe18ff2b +// 0x000006d0 +004cffab +ff460047 +013a0034 +fe7700ba +01b2fea6 +fe8b00eb +00e0fff3 +fffd0019 +ff03ff30 +019d0113 +fecafe5b +00ac00f5 +ffb9ffef +000ffffc +ffce009c +ffc4ffd1 +// 0x000006e0 +016d0152 +ff58ff3f +009f0010 +feeefff4 +027b00f8 +fd59ff5d +00b8ffb3 +0196012f +fe5cfe57 +00650059 +003bffa3 +ff2f00f7 +0034fe45 +00c6003f +ffe30208 +ffd8ff53 +// 0x000006f0 +ff97fe74 +ff7a0151 +00f9ff9a +feca00d8 +0133fe48 +fe890239 +01f8fd99 +feb201a1 +00dcfeff +fec900db +00e9000f +ff4dff3d +0102009f +fe300017 +01710180 +fef4fdbd +// 0x00000700 +0144ff64 +ff190129 +0068fdd4 +ffba035c +00d3fc84 +ff0d01d5 +ff65ff82 +016e01c3 +0006fc6e +fea50276 +0056fe7c +001c0158 +ff91ff06 +00ca004e +fffcfff4 +002800df +// 0x00000710 +0156feae +fb8b0179 +0362fdf6 +fe7401b8 +0191fec2 +fca50057 +03cb0118 +fe48fee5 +ff98011c +0123ff14 +ffdc0132 +ff0affb8 +00cbffc0 +0050ffd2 +ff800112 +fff6ff1d +// 0x00000720 +0137fe99 +fec20176 +00aeff0f +fe370060 +0318ff9e +fe55015a +ff56fef9 +00a301e7 +00c5fd47 +fe5c00bb +0116003b +ffddffe4 +000a0005 +ff84ff9d +004500f8 +ffedffbf +// 0x00000730 +00b50025 +fea6ffb8 +009200af +00b1ffc4 +ff4efeb4 +ff0d0336 +0200fc4b +fff302bd +ff8ffe23 +00a00047 +ffa6ffd3 +ff5301ac +0088fe69 +ffa6008b +0031ff20 +ff7500f1 +// 0x00000740 +001900db +ff58ff28 +010a008e +ff2c0101 +008efe1f +ff980183 +0085fff2 +ff1b0018 +0099fde8 +003702ca +ff49fea8 +0098ffc4 +febbfefc +016b01d2 +ff64feb5 +001f01c0 +// 0x00000750 +00dbff23 +fdc40016 +014cff26 +ff7401d7 +0088fe3d +ff80023b +00e1fd9a +ff7f0224 +017bfe32 +fe890100 +0039ff68 +007000c8 +ffffff20 +ff090020 +0126017b +ff97fdd8 +// 0x00000760 +00b4ff37 +ff420104 +ff43ff15 +00b400a2 +0106fedf +fed80177 +001fffda +019efff6 +fe5effac +ffb1ffbf +016bffc6 +ff40017c +fefafcd5 +004a0257 +019afee8 +fdd70213 +// 0x00000770 +0172fe13 +ff540096 +001fffab +ff92012a +0038ff35 +fffc0117 +0037ff1e +ff980018 +019000aa +fe9dfe77 +00970146 +ffa60018 +0134ff07 +fe9600db +015cffc4 +feffffef +// 0x00000780 +018c00ec +ff45ff44 +ffe50063 +ffc5003c +0193ff15 +fece0100 +ffbfff85 +00e101b3 +ff85fd42 +fffd0133 +fff0ffd8 +00ad009c +fdecfde2 +01b20177 +ffd0ffa3 +ffa70158 +// 0x00000790 +01dafdfe +fc8f016a +01d5ff89 +ff2b004a +00efff4d +fd92011c +02d5ff4d +fee900d5 +00d1ff98 +ff0f0067 +00aefecc +001301ee +0016ff38 +ff16ffc5 +0274007b +fd67feb0 +// 0x000007a0 +018c0006 +fe6dff93 +00360107 +00e6fecf +000dfff1 +fea2017a +00fefdb6 +00e60221 +fed2fde5 +006c00f4 +ff7aff01 +00e10244 +fe43fc19 +00680308 +014a0029 +fe3dff75 +// 0x000007b0 +00ac001a +ff95ff87 +0178ffef +fdac00f3 +0253ff0b +fe3e01aa +0172fe66 +ff860117 +003eff0b +ff6e0076 +fffc0039 +0001ff86 +000d0083 +008cffb8 +ffea0013 +ff73002f +// 0x000007c0 +ff37ff07 +006000c7 +fff500a2 +ff80feca +ffb80050 +012c0115 +ff5efdb7 +ff78028e +01b8fddc +fee101c2 +0017fdb9 +fff10167 +00470061 +ff7bffd5 +001bfe87 +ff25018c +// 0x000007d0 +0037ff05 +00ae0073 +002bff46 +fe800164 +01d40014 +fe06fffd +014cff8d +ffea0100 +0102fef8 +fec50100 +003dfe57 +ffb70107 +0065fffb +0167ff3d +fe2701ad +0149ff1a +// 0x000007e0 +fff4fda2 +ffd300e6 +002a011b +ff72fee4 +00c2ffe4 +ffda01b4 +ff26fdf4 +0192035e +ff92fc0b +feee026d +0091fe56 +00770145 +ffc7fe8b +001b0169 +0069fe78 +ffdc0193 +// 0x000007f0 +ff8efee4 +ffe9006e +003cff23 +ff20010c +0166ffea +fdf2ff70 +00b8ffa8 +00860154 +0048feb7 +ffb60183 +ffa5fe68 +fff3020b +0005feaf +0129ffe7 +fe3d0170 +0130fff3 diff --git a/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v b/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v index 2d64385..0e44145 100644 --- a/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v +++ b/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v @@ -7,17 +7,43 @@ // -> matched_filter_multi_segment -> range_bin_decimator // -> doppler_processor_optimized -> doppler_output // +// ============================================================================ +// TWO MODES (compile-time define): +// +// 1. GOLDEN_GENERATE mode (-DGOLDEN_GENERATE): +// Dumps all Doppler output samples to golden reference files. +// Run once on known-good RTL: +// iverilog -g2001 -DSIMULATION -DGOLDEN_GENERATE -o tb_golden_gen.vvp \ +// tb/tb_radar_receiver_final.v +// mkdir -p tb/golden +// vvp tb_golden_gen.vvp +// +// 2. Default mode (no GOLDEN_GENERATE): +// Loads golden files, compares each Doppler output against reference, +// and runs physics-based bounds checks. +// iverilog -g2001 -DSIMULATION -o tb_radar_receiver_final.vvp \ +// tb/tb_radar_receiver_final.v +// vvp tb_radar_receiver_final.vvp +// +// PREREQUISITES: +// - The directory tb/golden/ must exist before running either mode. +// Create it with: mkdir -p tb/golden +// +// TAP POINTS: +// Tap 1 (DDC output) - bounds checking only (CDC jitter -> non-deterministic) +// Signals: dut.ddc_out_i [17:0], dut.ddc_out_q [17:0], dut.ddc_valid_i +// Tap 2 (Doppler output) - golden compared (deterministic after MF buffering) +// Signals: doppler_output[31:0], doppler_valid, doppler_bin[4:0], +// range_bin_out[5:0] +// +// Golden file: tb/golden/golden_doppler.mem +// 2048 entries of 32-bit hex, indexed by range_bin*32 + doppler_bin +// // Strategy: // - Uses behavioral stub for ad9484_interface_400m (no Xilinx primitives) // - Overrides radar_mode_controller timing params for fast simulation // - Feeds 120 MHz tone at ADC input (IF frequency -> DDC passband) -// - Verifies structural correctness of Doppler outputs: -// * Outputs appear (doppler_valid asserted) -// * Correct output count per frame (64 range bins x 32 Doppler bins = 2048) -// * Range bin index covers 0..63 -// * Doppler bin index covers 0..31 -// * Output values are non-trivial (not all zeros) -// - Does NOT require bit-perfect match (too many cascaded stages) +// - Verifies structural correctness + golden comparison + bounds checks // // Convention: check task, VCD dump, CSV output, pass/fail summary // ============================================================================ @@ -147,7 +173,69 @@ task check; endtask // ============================================================================ -// OUTPUT MONITORING +// GOLDEN MEMORY DECLARATIONS AND LOAD/STORE LOGIC +// ============================================================================ +localparam GOLDEN_ENTRIES = 2048; // 64 range bins * 32 Doppler bins +localparam GOLDEN_TOLERANCE = 2; // +/- 2 LSB tolerance for comparison + +reg [31:0] golden_doppler [0:2047]; + +// -- Golden comparison tracking -- +integer golden_match_count; +integer golden_mismatch_count; +integer golden_max_err_i; +integer golden_max_err_q; +integer golden_compare_count; + +`ifdef GOLDEN_GENERATE + // In generate mode, we just initialize the array to X/0 + // and fill it as outputs arrive + integer gi; + initial begin + for (gi = 0; gi < GOLDEN_ENTRIES; gi = gi + 1) + golden_doppler[gi] = 32'd0; + golden_match_count = 0; + golden_mismatch_count = 0; + golden_max_err_i = 0; + golden_max_err_q = 0; + golden_compare_count = 0; + end +`else + // In comparison mode, load the golden reference + initial begin + $readmemh("tb/golden/golden_doppler.mem", golden_doppler); + golden_match_count = 0; + golden_mismatch_count = 0; + golden_max_err_i = 0; + golden_max_err_q = 0; + golden_compare_count = 0; + end +`endif + +// ============================================================================ +// DDC ENERGY ACCUMULATOR (Bounds Check B1) +// ============================================================================ +// Accumulate I^2 + Q^2 for all DDC valid samples. 64-bit to avoid overflow. +// DDC outputs are 18-bit signed -> squared max ~ 2^34, sum of many -> need 64-bit. +reg [63:0] ddc_energy_acc; +integer ddc_sample_count; + +initial begin + ddc_energy_acc = 64'd0; + ddc_sample_count = 0; +end + +always @(posedge clk_100m) begin + if (reset_n && dut.ddc_valid_i) begin + ddc_energy_acc <= ddc_energy_acc + + ($signed(dut.ddc_out_i) * $signed(dut.ddc_out_i)) + + ($signed(dut.ddc_out_q) * $signed(dut.ddc_out_q)); + ddc_sample_count = ddc_sample_count + 1; + end +end + +// ============================================================================ +// DOPPLER OUTPUT CAPTURE, GOLDEN COMPARISON, AND DUPLICATE DETECTION // ============================================================================ integer doppler_output_count; integer doppler_frame_count; @@ -164,6 +252,18 @@ reg frame_done_prev; // CSV output integer csv_fd; +// Duplicate detection: one-hot bitmap per (range_bin, doppler_bin) +// 64 range bins x 32 doppler bins = 2048 bits -> use an array of 64 x 32-bit regs +reg [31:0] index_seen [0:63]; +integer dup_count; + +// Bounds check B2: Doppler energy tracking per range bin +// For each range bin, track peak |I|+|Q| across all 32 Doppler bins +// and total energy. Verifies pipeline computes non-trivial Doppler spectra. +reg [31:0] peak_dbin_mag [0:63]; // max |I|+|Q| across all Doppler bins +reg [31:0] total_dbin_energy [0:63]; // sum of |I|+|Q| across all 32 Doppler bins +integer b2_init_idx; + initial begin doppler_output_count = 0; doppler_frame_count = 0; @@ -174,6 +274,13 @@ initial begin first_doppler_time = 0; frame_output_count = 0; frame_done_prev = 0; + dup_count = 0; + + for (b2_init_idx = 0; b2_init_idx < 64; b2_init_idx = b2_init_idx + 1) begin + index_seen[b2_init_idx] = 32'd0; + peak_dbin_mag[b2_init_idx] = 32'd0; + total_dbin_energy[b2_init_idx] = 32'd0; + end csv_fd = $fopen("tb/cosim/rx_final_doppler_out.csv", "w"); if (csv_fd) $fdisplay(csv_fd, "cycle,range_bin,doppler_bin,output_hex"); @@ -181,7 +288,18 @@ end // Monitor doppler outputs -- only after reset released always @(posedge clk_100m) begin - if (reset_n && doppler_valid) begin + if (reset_n && doppler_valid) begin : doppler_capture_block + // ---- Signed intermediates for golden comparison ---- + reg signed [16:0] actual_i, actual_q; + reg signed [16:0] expected_i, expected_q; + reg signed [16:0] err_i_signed, err_q_signed; + integer abs_err_i, abs_err_q; + integer gidx; + reg [31:0] expected_val; + // ---- Magnitude intermediates for B2 ---- + reg signed [16:0] mag_i_signed, mag_q_signed; + integer mag_i, mag_q, mag_sum; + doppler_output_count = doppler_output_count + 1; frame_output_count = frame_output_count + 1; @@ -209,6 +327,71 @@ always @(posedge clk_100m) begin // Progress reporting (every 256 outputs) if ((doppler_output_count % 256) == 0) $display("[INFO] %0d doppler outputs so far (t=%0t)", doppler_output_count, $time); + + // ---- Golden index computation ---- + gidx = range_bin_out * 32 + doppler_bin; + + // ---- Duplicate detection (B5) ---- + if (range_bin_out < 64 && doppler_bin < 32) begin + if (index_seen[range_bin_out][doppler_bin]) begin + dup_count = dup_count + 1; + if (dup_count <= 10) + $display("[WARN] Duplicate index: rbin=%0d dbin=%0d (count=%0d)", + range_bin_out, doppler_bin, dup_count); + end + index_seen[range_bin_out] = index_seen[range_bin_out] | (32'd1 << doppler_bin); + end + + // ---- Bounds check B2: Doppler energy tracking ---- + mag_i_signed = $signed(doppler_output[15:0]); + mag_q_signed = $signed(doppler_output[31:16]); + mag_i = (mag_i_signed < 0) ? -mag_i_signed : mag_i_signed; + mag_q = (mag_q_signed < 0) ? -mag_q_signed : mag_q_signed; + mag_sum = mag_i + mag_q; + + if (range_bin_out < 64) begin + total_dbin_energy[range_bin_out] = total_dbin_energy[range_bin_out] + mag_sum; + if (mag_sum > peak_dbin_mag[range_bin_out]) + peak_dbin_mag[range_bin_out] = mag_sum; + end + +`ifdef GOLDEN_GENERATE + // ---- GOLDEN GENERATE: store output ---- + if (gidx < GOLDEN_ENTRIES) + golden_doppler[gidx] = doppler_output; +`else + // ---- GOLDEN COMPARE: check against reference ---- + if (gidx < GOLDEN_ENTRIES) begin + expected_val = golden_doppler[gidx]; + + actual_i = $signed(doppler_output[15:0]); + actual_q = $signed(doppler_output[31:16]); + expected_i = $signed(expected_val[15:0]); + expected_q = $signed(expected_val[31:16]); + + err_i_signed = actual_i - expected_i; + err_q_signed = actual_q - expected_q; + + abs_err_i = (err_i_signed < 0) ? -err_i_signed : err_i_signed; + abs_err_q = (err_q_signed < 0) ? -err_q_signed : err_q_signed; + + golden_compare_count = golden_compare_count + 1; + + if (abs_err_i > golden_max_err_i) golden_max_err_i = abs_err_i; + if (abs_err_q > golden_max_err_q) golden_max_err_q = abs_err_q; + + if (abs_err_i <= GOLDEN_TOLERANCE && abs_err_q <= GOLDEN_TOLERANCE) begin + golden_match_count = golden_match_count + 1; + end else begin + golden_mismatch_count = golden_mismatch_count + 1; + if (golden_mismatch_count <= 20) + $display("[MISMATCH] idx=%0d rbin=%0d dbin=%0d actual=%08h expected=%08h err_i=%0d err_q=%0d", + gidx, range_bin_out, doppler_bin, + doppler_output, expected_val, + abs_err_i, abs_err_q); + end + end +`endif end // Track frame completions via doppler_proc -- only after reset @@ -256,7 +439,7 @@ always @(posedge clk_100m) begin end // ============================================================================ -// MF PIPELINE DEBUG MONITOR — track state transitions +// MF PIPELINE DEBUG MONITOR -- track state transitions // ============================================================================ reg [3:0] mf_state_prev; reg [3:0] chain_state_prev; @@ -310,7 +493,12 @@ end // ~4050 cycles/chirp x 32 chirps = ~130K, plus latency buffer priming, // plus Doppler processing time. Set generous timeout. -localparam SIM_TIMEOUT = 2_000_000; // 2M cycles — full pipeline with multi-segment drain +localparam SIM_TIMEOUT = 2_000_000; // 2M cycles -- full pipeline with multi-segment drain + +// Maximum DDC RMS energy threshold (B1). 18-bit ADC, squared max ~2^34. +// With ~100k samples, absolute max energy ~ 100000 * 2^34 ~ 1.7e15 < 2^51. +// Set a generous ceiling that catches true overflow/garbage. +localparam [63:0] DDC_MAX_ENERGY = 64'h00FF_FFFF_FFFF_FFFF; // ~2^56 initial begin // VCD dump disabled for long integration test -- uncomment for debug @@ -346,7 +534,16 @@ initial begin end end - // ---- RUN CHECKS ---- + // ---- DUMP GOLDEN FILE (generate mode only) ---- +`ifdef GOLDEN_GENERATE + $writememh("tb/golden/golden_doppler.mem", golden_doppler); + $display("[GOLDEN_GENERATE] Wrote tb/golden/golden_doppler.mem (%0d entries captured)", + doppler_output_count); +`endif + + // ================================================================ + // RUN CHECKS + // ================================================================ $display(""); $display("============================================================"); $display("RADAR RECEIVER FINAL -- INTEGRATION TEST RESULTS"); @@ -355,38 +552,41 @@ initial begin $display("Doppler frames complete: %0d", doppler_frame_count); $display("Non-zero outputs: %0d", nonzero_output_count); $display("DDC valid count: %0d", ddc_valid_count); + $display("DDC sample count (tap): %0d", ddc_sample_count); $display("MF output count: %0d", mf_valid_count); $display("Range decim count: %0d", range_decim_count); $display("============================================================"); $display(""); - // ---- CHECK 1: Pipeline activity ---- + // ================================================================ + // STRUCTURAL CHECKS (original 10 checks, kept as-is) + // ================================================================ + + // ---- CHECK S1: Pipeline activity ---- check(ddc_valid_count > 0, - "DDC produces valid outputs (adc_valid_sync asserted)"); + "S1: DDC produces valid outputs (adc_valid_sync asserted)"); - // ---- CHECK 2: MF outputs appear ---- + // ---- CHECK S2: MF outputs appear ---- check(mf_valid_count > 0, - "Matched filter produces outputs (range_valid asserted)"); + "S2: Matched filter produces outputs (range_valid asserted)"); - // ---- CHECK 3: Range decimator outputs appear ---- + // ---- CHECK S3: Range decimator outputs appear ---- check(range_decim_count > 0, - "Range bin decimator produces outputs"); + "S3: Range bin decimator produces outputs"); - // ---- CHECK 4: Doppler outputs appear ---- + // ---- CHECK S4: Doppler outputs appear ---- check(doppler_output_count > 0, - "Doppler processor produces outputs (doppler_valid asserted)"); + "S4: Doppler processor produces outputs (doppler_valid asserted)"); - // ---- CHECK 5: Correct output count per frame ---- - // A complete Doppler frame should produce 64 x 32 = 2048 outputs + // ---- CHECK S5: Correct output count per frame (legacy: >= 2048) ---- if (doppler_frame_count > 0) begin check(doppler_output_count >= 2048, - "At least 2048 doppler outputs (one full frame: 64 rbins x 32 dbins)"); + "S5: At least 2048 doppler outputs (one full frame: 64 rbins x 32 dbins)"); end else begin - check(0, "At least 2048 doppler outputs (NO FRAME COMPLETED)"); + check(0, "S5: At least 2048 doppler outputs (NO FRAME COMPLETED)"); end - // ---- CHECK 6: Range bin coverage ---- - // Count how many unique range bins appeared + // ---- CHECK S6: Range bin coverage ---- begin : count_range_bins integer rb_count, rb_i; rb_count = 0; @@ -395,10 +595,10 @@ initial begin end $display("[INFO] Unique range bins seen: %0d / 64", rb_count); check(rb_count == 64, - "All 64 range bins present in Doppler output"); + "S6: All 64 range bins present in Doppler output"); end - // ---- CHECK 7: Doppler bin coverage ---- + // ---- CHECK S7: Doppler bin coverage ---- begin : count_doppler_bins integer db_count, db_i; db_count = 0; @@ -407,28 +607,142 @@ initial begin end $display("[INFO] Unique Doppler bins seen: %0d / 32", db_count); check(db_count == 32, - "All 32 Doppler bins present in Doppler output"); + "S7: All 32 Doppler bins present in Doppler output"); end - // ---- CHECK 8: Non-trivial outputs ---- + // ---- CHECK S8: Non-trivial outputs ---- check(nonzero_output_count > 0, - "At least some Doppler outputs are non-zero"); + "S8: At least some Doppler outputs are non-zero"); - // ---- CHECK 9: Non-zero fraction ---- - // With a tone input, we expect most outputs to have some energy + // ---- CHECK S9: Non-zero fraction ---- if (doppler_output_count > 0) begin check(nonzero_output_count > doppler_output_count / 4, - "More than 25pct of Doppler outputs are non-zero"); + "S9: More than 25pct of Doppler outputs are non-zero"); end else begin - check(0, "More than 25pct of Doppler outputs are non-zero (NO OUTPUTS)"); + check(0, "S9: More than 25pct of Doppler outputs are non-zero (NO OUTPUTS)"); end - // ---- CHECK 10: Pipeline didn't stall ---- + // ---- CHECK S10: Pipeline didn't stall ---- check(ddc_valid_count > 100, - "DDC produced substantial output (>100 valid samples)"); + "S10: DDC produced substantial output (>100 valid samples)"); - // ---- SUMMARY ---- + // ================================================================ + // GOLDEN COMPARISON REPORT + // ================================================================ +`ifdef GOLDEN_GENERATE $display(""); + $display("Golden comparison: SKIPPED (GOLDEN_GENERATE mode)"); + $display(" Wrote golden reference with %0d Doppler samples", doppler_output_count); +`else + $display(""); + $display("------------------------------------------------------------"); + $display("GOLDEN COMPARISON (tolerance=%0d LSB)", GOLDEN_TOLERANCE); + $display("------------------------------------------------------------"); + $display("Golden comparison: %0d/%0d match (tolerance=%0d LSB)", + golden_match_count, golden_compare_count, GOLDEN_TOLERANCE); + $display(" Mismatches: %0d (I-ch max_err=%0d, Q-ch max_err=%0d)", + golden_mismatch_count, golden_max_err_i, golden_max_err_q); + + // CHECK G1: All golden comparisons match + if (golden_compare_count > 0) begin + check(golden_mismatch_count == 0, + "G1: All Doppler outputs match golden reference within tolerance"); + end else begin + check(0, "G1: All Doppler outputs match golden reference (NO COMPARISONS)"); + end +`endif + + // ================================================================ + // BOUNDS CHECKS (active in both modes) + // ================================================================ + $display(""); + $display("------------------------------------------------------------"); + $display("BOUNDS CHECKS"); + $display("------------------------------------------------------------"); + + // ---- B1: DDC RMS Energy ---- + $display(" DDC energy accumulator: %0d (samples=%0d)", ddc_energy_acc, ddc_sample_count); + check(ddc_energy_acc > 64'd0, + "B1a: DDC RMS energy > 0 (DDC is not dead)"); + check(ddc_energy_acc < DDC_MAX_ENERGY, + "B1b: DDC RMS energy < MAX_THRESHOLD (no overflow/garbage)"); + + // ---- B2: Doppler Energy Per Range Bin ---- + // Every range bin should have non-trivial Doppler energy (peak mag > 0) + // and reasonable total energy (not degenerate). This catches a dead MF or + // Doppler stage that produces zeros for some range bins. + begin : b2_check_block + integer b2_rb; + integer nontrivial_count; + integer min_peak, max_peak; + nontrivial_count = 0; + min_peak = 32'h7FFFFFFF; + max_peak = 0; + for (b2_rb = 0; b2_rb < 64; b2_rb = b2_rb + 1) begin + if (peak_dbin_mag[b2_rb] > 0) + nontrivial_count = nontrivial_count + 1; + if (peak_dbin_mag[b2_rb] < min_peak) + min_peak = peak_dbin_mag[b2_rb]; + if (peak_dbin_mag[b2_rb] > max_peak) + max_peak = peak_dbin_mag[b2_rb]; + end + $display(" Doppler peak mag: min=%0d max=%0d, non-trivial in %0d/64 range bins", + min_peak, max_peak, nontrivial_count); + // All 64 range bins must have non-zero peak Doppler energy + check(nontrivial_count == 64, + "B2a: All range bins have non-trivial Doppler energy"); + // Peak magnitude should be bounded (not overflowing to max signed value) + check(max_peak < 32000, + "B2b: Peak Doppler magnitude within expected range (no overflow)"); + end + + // ---- B3: Exact Doppler Output Count ---- + $display(" Doppler output count: %0d (expected 2048)", doppler_output_count); + check(doppler_output_count == 2048, + "B3: Exact output count = 2048 (64 range x 32 Doppler)"); + + // ---- B4: Full Range/Doppler Bin Coverage (exact) ---- + begin : b4_check_block + integer b4_rb_count, b4_db_count, b4_i; + b4_rb_count = 0; + b4_db_count = 0; + for (b4_i = 0; b4_i < 64; b4_i = b4_i + 1) begin + if (range_bin_seen[b4_i]) b4_rb_count = b4_rb_count + 1; + end + for (b4_i = 0; b4_i < 32; b4_i = b4_i + 1) begin + if (doppler_bin_seen[b4_i]) b4_db_count = b4_db_count + 1; + end + check(b4_rb_count == 64 && b4_db_count == 32, + "B4: Full bin coverage: 64 range x 32 Doppler"); + end + + // ---- B5: No Duplicate Indices ---- + $display(" Duplicate (rbin, dbin) indices: %0d", dup_count); + check(dup_count == 0, + "B5: No duplicate (rbin, dbin) indices"); + + // ================================================================ + // FINAL SUMMARY + // ================================================================ + $display(""); + $display("============================================================"); + $display("INTEGRATION TEST -- GOLDEN COMPARISON + BOUNDS"); + $display("============================================================"); +`ifdef GOLDEN_GENERATE + $display("Mode: GOLDEN_GENERATE (reference dump, comparison skipped)"); +`else + $display("Golden comparison: %0d/%0d match (tolerance=%0d LSB)", + golden_match_count, golden_compare_count, GOLDEN_TOLERANCE); + $display(" Mismatches: %0d (I-ch max_err=%0d, Q-ch max_err=%0d)", + golden_mismatch_count, golden_max_err_i, golden_max_err_q); +`endif + $display("Bounds checks:"); + $display(" B1: DDC RMS energy in range [%0d, %0d]", + (ddc_energy_acc > 0) ? 1 : 0, DDC_MAX_ENERGY); + $display(" B2: Doppler energy per range bin check"); + $display(" B3: Exact output count: %0d", doppler_output_count); + $display(" B4: Full bin coverage"); + $display(" B5: Duplicate index count: %0d", dup_count); $display("============================================================"); $display("SUMMARY: %0d / %0d tests passed", pass_count, total_tests); if (fail_count == 0)