如何仅使用时钟在 Verilog 中设计串行到并行缓冲区?

How do I design Serial to Parallel Buffer in Verilog only using clocks?

我希望在 Verilog 中设计串并转换器,将快速时钟串行输入转换为较慢时钟并行输入。我尝试了以下在 RTL 中工作但未在 Cadence Conformal 上验证的代码。 nclk 比 clk 快 16 倍。串行数据以 nclk 速率输入,并行数据以 clk 速率输出。

sEEG - 串行输入 eegOut - 并行输出

由于流片焊盘限制,我只能将clk和nclk作为我的操作参考。

以下是我想出的代码,它在功能模拟中运行良好,但形式验证失败。

module deserializer(sEEG, nclk, clk, eegOut);
    input sEEG;
    input nclk,clk;
    reg [15:0] temp;
    output reg [15:0] eegOut;
    reg [4:0] i;
    
    always @(negedge nclk) begin
        temp[i] = sEEG;
        i = i + 1;
    end

    always@(posedge clk) begin
        i<=0;
        eegOut <= temp;
    end
endmodule

我觉得您应该使用四位来索引 16 个元素。如果您对模块进行参数化,则可以通过以下方式完成:

# (parameter WIDTH = 16)

然后将其用作:

localparam BIT_SEL = $clog2(WIDTH); //..this should give you "4" if WIDTH = 16
reg [BIT_SEL-1:0] i;

此外,您可能想要包括一个时钟同步器,您不想要亚稳态问题,一个简单的方法是包括“双触发器”,实际上是缓冲数据并将其复制到下一个慢时钟周期(增加 1 个慢时钟周期延迟)。所以,也许这行得通:

module deserializer
# (parameter WIDTH = 16)
(sEEG, nclk, clk, eegOut);
    input sEEG;
    input nclk,clk;
    reg [WIDTH-1:0] temp;
    reg [WIDTH-1:0] temp_reg; //..synchronizer
    output reg [WIDTH-1:0] eegOut;
    
    always @(negedge nclk) begin
        temp[WIDTH-2:0] <= temp[WIDTH-1:1];
        temp[WIDTH-1]   <= sEEG;
    end

    always@(posedge clk) begin
        temp_reg <= temp;
        eegOut   <= temp_reg;
    end
endmodule