mirror of
https://github.com/SikongJueluo/Mini-Nav.git
synced 2026-07-12 20:15:31 +08:00
feat(hw): add banked CAM pipeline with grouped read/write noise
- Add cam_core_banked.sv with 8-lane banked CAM core - Add cam_write_noise.sv and cam_read_noise.sv for grouped noise injection - Add noise_mask_grouped.sv generating grouped flip masks from 128-bit PRNG - Add match_engine_pipeline.sv with multi-stage pipelined top-1 selection - Add popcount_pipeline.sv for pipelined popcount operations - Refactor test_cam_basic.py with parametrized DUT introspection helpers - Add Python ref_model match_top1_with_read_noise() for read noise verification - Update Makefile with separate WRITE_NOISE_* and READ_NOISE_* parameter groups - Add new testbenches: test_cam_core_banked, test_cam_read_noise, test_cam_write_noise, test_match_engine_pipeline, test_ref_model_noise breaking change hint: NUM_ROWS default changed from 512→4096, LANES from 16→8
This commit is contained in:
37
hw/rtl/noise_mask_grouped.sv
Normal file
37
hw/rtl/noise_mask_grouped.sv
Normal file
@@ -0,0 +1,37 @@
|
||||
`timescale 1ns / 1ps
|
||||
`include "cam_params.svh"
|
||||
|
||||
module noise_mask_grouped #(
|
||||
parameter int HASH_BITS = `HASH_BITS,
|
||||
parameter int NOISE_BITS = 8,
|
||||
parameter int NOISE_RATE_NUM = 1,
|
||||
parameter int NOISE_RATE_DEN = 100
|
||||
) (
|
||||
input logic [127:0] random_i,
|
||||
output logic [HASH_BITS-1:0] mask_o
|
||||
);
|
||||
localparam int GROUP_BITS = HASH_BITS / NOISE_BITS;
|
||||
localparam int BIT_INDEX_BITS = 6;
|
||||
localparam int SAMPLE_BITS = 8;
|
||||
localparam int GROUP_RAND_BITS = BIT_INDEX_BITS + SAMPLE_BITS;
|
||||
localparam int SAMPLE_RANGE = 1 << SAMPLE_BITS;
|
||||
localparam int THRESHOLD = (NOISE_RATE_NUM * SAMPLE_RANGE) / NOISE_RATE_DEN;
|
||||
|
||||
initial begin
|
||||
if (NOISE_BITS <= 0) $fatal(1, "NOISE_BITS must be > 0");
|
||||
if (HASH_BITS % NOISE_BITS != 0) $fatal(1, "HASH_BITS must be divisible by NOISE_BITS");
|
||||
if (GROUP_BITS != 64) $fatal(1, "GROUP_BITS must be 64 for 6-bit grouped noise");
|
||||
if (NOISE_BITS * GROUP_RAND_BITS > 128) $fatal(1, "NOISE_BITS consumes more than 128 random bits");
|
||||
if (NOISE_RATE_DEN <= 0) $fatal(1, "NOISE_RATE_DEN must be > 0");
|
||||
if (NOISE_RATE_NUM < 0 || NOISE_RATE_NUM > NOISE_RATE_DEN) $fatal(1, "NOISE_RATE_NUM out of range");
|
||||
end
|
||||
|
||||
always_comb begin
|
||||
mask_o = '0;
|
||||
for (int i = 0; i < NOISE_BITS; i++) begin
|
||||
if (random_i[i * GROUP_RAND_BITS + BIT_INDEX_BITS +: SAMPLE_BITS] < THRESHOLD) begin
|
||||
mask_o[i * GROUP_BITS + random_i[i * GROUP_RAND_BITS +: BIT_INDEX_BITS]] = 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
Reference in New Issue
Block a user