mirror of
https://github.com/SikongJueluo/Mini-Nav.git
synced 2026-07-12 20:15:31 +08:00
- 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
96 lines
3.6 KiB
Systemverilog
96 lines
3.6 KiB
Systemverilog
`timescale 1ns / 1ps
|
|
`include "cam_params.svh"
|
|
|
|
module cam_noisy #(
|
|
parameter bit WRITE_NOISE_EN = 1'b1,
|
|
parameter int WRITE_NOISE_RATE_NUM = 1,
|
|
parameter int WRITE_NOISE_RATE_DEN = 100,
|
|
parameter int WRITE_NOISE_BITS = 8,
|
|
parameter logic [63:0] WRITE_NOISE_SEED = 64'hB504_F32D_B504_F32D,
|
|
parameter bit READ_NOISE_EN = 1'b1,
|
|
parameter int READ_NOISE_RATE_NUM = 1,
|
|
parameter int READ_NOISE_RATE_DEN = 100,
|
|
parameter int READ_NOISE_BITS = 8,
|
|
parameter logic [63:0] READ_NOISE_SEED = 64'h6A09_E667_F3BC_C909
|
|
) (
|
|
input logic clk,
|
|
input logic rst_n,
|
|
input logic wr_valid,
|
|
output logic wr_ready,
|
|
input logic [(`ROW_BITS)-1:0] wr_addr,
|
|
input logic [(`HASH_BITS)-1:0] write_hash,
|
|
input logic rd_valid_i,
|
|
input logic [(`ROW_BITS)-1:0] rd_base_row_i,
|
|
output logic rd_valid_o,
|
|
output logic [(`LANES)*(`ROW_BITS)-1:0] rd_row_ids_o,
|
|
output logic [(`LANES)*(`HASH_BITS)-1:0] rd_hashes_o,
|
|
output logic [(`LANES)-1:0] rd_lane_valid_o
|
|
);
|
|
|
|
// ── Intermediate wires between pipeline stages ──
|
|
logic core_wr_valid;
|
|
logic [(`ROW_BITS)-1:0] core_wr_row;
|
|
logic [(`HASH_BITS)-1:0] core_wr_hash;
|
|
|
|
logic core_rd_valid;
|
|
logic [(`LANES)*(`ROW_BITS)-1:0] core_rd_row_ids;
|
|
logic [(`LANES)*(`HASH_BITS)-1:0] core_rd_hashes;
|
|
logic [(`LANES)-1:0] core_rd_lane_valid;
|
|
|
|
// ── Write noise pipeline ──
|
|
cam_write_noise #(
|
|
.WRITE_NOISE_EN (WRITE_NOISE_EN),
|
|
.WRITE_NOISE_RATE_NUM (WRITE_NOISE_RATE_NUM),
|
|
.WRITE_NOISE_RATE_DEN (WRITE_NOISE_RATE_DEN),
|
|
.WRITE_NOISE_BITS (WRITE_NOISE_BITS),
|
|
.WRITE_NOISE_SEED (WRITE_NOISE_SEED)
|
|
) u_write_noise (
|
|
.clk (clk),
|
|
.rst_n (rst_n),
|
|
.wr_valid (wr_valid),
|
|
.wr_ready (wr_ready),
|
|
.wr_row (wr_addr),
|
|
.wr_hash (write_hash),
|
|
.core_wr_valid (core_wr_valid),
|
|
.core_wr_row (core_wr_row),
|
|
.core_wr_hash (core_wr_hash)
|
|
);
|
|
|
|
// ── Banked synchronous BRAM storage ──
|
|
cam_core_banked u_core_banked (
|
|
.clk (clk),
|
|
.rst_n (rst_n),
|
|
.wr_valid (core_wr_valid),
|
|
.wr_ready (),
|
|
.wr_row (core_wr_row),
|
|
.wr_hash (core_wr_hash),
|
|
.rd_valid_i (rd_valid_i),
|
|
.rd_base_row_i (rd_base_row_i),
|
|
.rd_valid_o (core_rd_valid),
|
|
.rd_row_ids_o (core_rd_row_ids),
|
|
.rd_hashes_o (core_rd_hashes),
|
|
.rd_lane_valid_o (core_rd_lane_valid)
|
|
);
|
|
|
|
// ── Read noise pipeline ──
|
|
cam_read_noise #(
|
|
.READ_NOISE_EN (READ_NOISE_EN),
|
|
.READ_NOISE_RATE_NUM (READ_NOISE_RATE_NUM),
|
|
.READ_NOISE_RATE_DEN (READ_NOISE_RATE_DEN),
|
|
.READ_NOISE_BITS (READ_NOISE_BITS),
|
|
.READ_NOISE_SEED (READ_NOISE_SEED)
|
|
) u_read_noise (
|
|
.clk (clk),
|
|
.rst_n (rst_n),
|
|
.valid_i (core_rd_valid),
|
|
.row_ids_i (core_rd_row_ids),
|
|
.hashes_i (core_rd_hashes),
|
|
.lane_valid_i (core_rd_lane_valid),
|
|
.valid_o (rd_valid_o),
|
|
.row_ids_o (rd_row_ids_o),
|
|
.hashes_noisy_o (rd_hashes_o),
|
|
.lane_valid_o (rd_lane_valid_o)
|
|
);
|
|
|
|
endmodule
|