给CodeBuddy写的async fifo做了个验证,发现了两个bug
专栏:ExASIC Dec. 30, 2025, 10:32 a.m. 24 阅读
一个语法错,一个满标志没拉高。

前些天用AI写了一个fifo《我用CodeBuddy写了一个async fifo》,今天写了一个testbench仿了一下,居然有发现了两个bug。

第一个是语法错,寄存器定义成了wire类型。

    wire [ADDR_WIDTH:0] wr_ptr_gray_sync1; // 写指针格雷码同步到读时钟域(第一级)
    wire [ADDR_WIDTH:0] wr_ptr_gray_sync2; // 写指针格雷码同步到读时钟域(第二级)
    wire [ADDR_WIDTH:0] rd_ptr_gray_sync1; // 读指针格雷码同步到写时钟域(第一级)
    wire [ADDR_WIDTH:0] rd_ptr_gray_sync2; // 读指针格雷码同步到写时钟域(第二级)

    // 同步读指针到写时钟域
    always @(posedge wr_clk or negedge wr_rst_n) begin
        if (!wr_rst_n) begin
            rd_ptr_gray_sync1 <= {ADDR_WIDTH+1{1'b0}};
            rd_ptr_gray_sync2 <= {ADDR_WIDTH+1{1'b0}};
        end else begin
            rd_ptr_gray_sync1 <= rd_ptr_gray;
            rd_ptr_gray_sync2 <= rd_ptr_gray_sync1;
        end
    end

    // 同步写指针到读时钟域
    always @(posedge rd_clk or negedge rd_rst_n) begin
        if (!rd_rst_n) begin
            wr_ptr_gray_sync1 <= {ADDR_WIDTH+1{1'b0}};
            wr_ptr_gray_sync2 <= {ADDR_WIDTH+1{1'b0}};
        end else begin
            wr_ptr_gray_sync1 <= wr_ptr_gray;
            wr_ptr_gray_sync2 <= wr_ptr_gray_sync1;
        end
    end

第二个bug是fifo的满标志没有拉高。

写了一个简单的testbench,编译仿真,得到波形如下。深度为8的fifo,在写完第8个数据后,满标志full并没有拉高。

galaxsim -R \ 
    -sverilog \ 
    -timescale=1ns/1ps \ 
    -debug_access \ 
    -f file.lst

image.png

空标志没有问题,有数据写进来,empty拉低,读完8个数据后,empty又回到高电平。

    // 满状态判断(写指针和同步来的读指针的最高位和次高位相反,其余位相同)
    assign full_int = (wr_ptr_gray == {~rd_ptr_gray_sync2[ADDR_WIDTH:ADDR_WIDTH-1], 
                                       rd_ptr_gray_sync2[ADDR_WIDTH-2:0]});
    
    // 空状态判断(读指针和同步来的写指针相同)
    assign empty_int = (rd_ptr_gray == wr_ptr_gray_sync2);

具体啥问题下次再说了。

感谢阅读,更多文章点击这里:【专栏:ExASIC】
最新20篇 开设专栏