用于读取芯片内置的唯一 64 位 DNA 识别码dna_reader/** 读取DNA的8字节数据 **/ module dna_reader ( input wire i_clk, input wire i_rst_n, output reg [56:0] or_dna_value, output reg or_done ); // DNA_PORT 原语信号 reg r_read_en; reg r_shift_en; wire w_dout; // 读取 bit 计数 reg [5:0] r_bit_cnt; // 实例化 DNA_PORT 原语 DNA_PORT #( .SIM_DNA_VALUE(57h123456789ABCDE) // 仿真用综合时无效 ) u_dna ( .CLK(i_clk), .READ(r_read_en), .SHIFT(r_shift_en), .DOUT(w_dout), .DIN(1b0) ); // 状态机读取 DNA always (posedge i_clk or negedge i_rst_n) begin if (!i_rst_n) begin r_read_en 1b1; r_shift_en 1b0; r_bit_cnt 6d0; or_dna_value 57d0; or_done 1b0; end else if (r_read_en) begin r_read_en 1b0; // 只拉高一个周期启动读取 r_shift_en 1b1; end else if (r_shift_en r_bit_cnt 57) begin or_dna_value {or_dna_value[55:0], w_dout}; // 左移一位 r_bit_cnt r_bit_cnt 1; end else if (r_bit_cnt 57) begin r_shift_en 1b0; or_done 1b1; end end endmoduletbtimescale 1ns / 1ps // 仿真用 DNA_PORT 模型 module DNA_PORT #( parameter SIM_DNA_VALUE 57h0 ) ( input wire CLK, input wire READ, input wire SHIFT, input wire DIN, output wire DOUT ); reg [56:0] dna_shift; assign DOUT dna_shift[56]; always (posedge CLK) begin if (READ) dna_shift SIM_DNA_VALUE; else if (SHIFT) dna_shift {dna_shift[55:0], DIN}; end endmodule // 读取DNA的8字节数据 module dna_reader ( input wire i_clk, input wire i_rst_n, output reg [56:0] or_dna_value, output reg or_done ); reg r_read_en; reg r_shift_en; wire w_dout; reg [5:0] r_bit_cnt; DNA_PORT #( .SIM_DNA_VALUE(57h123456789ABCDE) ) u_dna ( .CLK(i_clk), .READ(r_read_en), .SHIFT(r_shift_en), .DOUT(w_dout), .DIN(1b0) ); always (posedge i_clk or negedge i_rst_n) begin if (!i_rst_n) begin r_read_en 1b1; r_shift_en 1b0; r_bit_cnt 6d0; or_dna_value 57d0; or_done 1b0; end else if (r_read_en) begin r_read_en 1b0; r_shift_en 1b1; end else if (r_shift_en r_bit_cnt 57) begin or_dna_value {or_dna_value[55:0], w_dout}; r_bit_cnt r_bit_cnt 1; end else if (r_bit_cnt 57) begin r_shift_en 1b0; or_done 1b1; end end endmodule // TESTBENCH module tb(); reg i_clk; reg i_rst_n; wire [56:0] or_dna_value; wire or_done; dna_reader u_dna_reader ( .i_clk (i_clk), .i_rst_n (i_rst_n), .or_dna_value (or_dna_value), .or_done (or_done) ); initial begin i_clk 1b0; forever #5 i_clk ~i_clk; end initial begin i_rst_n 1b0; #20; i_rst_n 1b1; wait(or_done); #10; $display(); $display(DNA 读取完成); $display(读取值: 0x%h, or_dna_value); $display(预期值: 0x123456789abcde); $display(); if(or_dna_value 57h123456789ABCDE) $display(✅ 仿真成功); else $display(❌ 仿真失败); #100; $finish; end endmodule测试输出# run 1000nsDNA 读取完成 读取值: 0x0123456789abcde 预期值: 0x123456789abcde仿真成功