如何使用组合逻辑中的内存合成verilog代码。?

如何使用组合逻辑中的内存合成verilog代码。?,verilog,Verilog,我使用Verilog代码组合逻辑中的缓冲区,我尝试使用spyglass合成工具合成Verilog代码。但我做不到。 显示 错误:为信号缓冲器A、缓冲器B推断闩锁 我在下面附上我的Verilog代码,有人能帮我解决这个问题吗 多谢各位 这是我的密码: module FIFObuffer (Clk,Reset,Enable, dataIn,dataOut); input Clk,Reset,Enable; input signed[16:0]dataIn; outp

我使用Verilog代码组合逻辑中的缓冲区,我尝试使用spyglass合成工具合成Verilog代码。但我做不到。 显示

错误:为信号缓冲器A、缓冲器B推断闩锁

我在下面附上我的Verilog代码,有人能帮我解决这个问题吗

多谢各位

这是我的密码:

    module FIFObuffer (Clk,Reset,Enable, dataIn,dataOut); 
    input Clk,Reset,Enable;
    input signed[16:0]dataIn;
    output reg [16:0]dataOut; 
    //internal registers 
     reg signed [16:0]data_1;




                           
        reg [16:0] A[0:107];                      // 
        Circular buffers A & B
        reg [16:0] B[0:107];
        reg [16:0]Counter    = 0;
        reg [16:0]writecount = 0;
        reg [16:0]readcount  = 1; 

         reg signed [16:0]C_A;
         reg signed [16:0]C_B;


     always@(*)begin 
    
    
    if (Enable)begin 

        A[writecount] = dataIn;                  
        //Circular buffer 
        B[writecount] = Counter+1;
        C_A = A[writecount];
        C_B = B[writecount];
        writecount = writecount+1;
        Counter=0;
    end
    else begin
        A[writecount] = dataIn;                  
        //Circular buffer 
        B[writecount] = Counter+1;
        C_A = A[writecount];
        C_B = B[writecount];
        writecount = writecount+1;
        Counter=0;
    end 
        
end module

您得到推断锁存的原因是您没有使用提供的时钟。时钟存储器变成寄存器或RAM,非时钟存储器是闩锁。您的
always
块当前是组合块,因为它是一个
always@(*)
,意思是“在任何输入更改时运行此代码”。相反,您需要一个时钟块:
always@(posedge Clk)
它在
Clk
上有正边缘时运行。在时钟边缘变化的存储器是寄存器或RAM

例如:

always@(posedge Clk) begin
    if (Reset) begin //positive, synchronous reset
        //reset your counters to zero
        Counter <= 0;
        ReadCounter <= 0;
        WriteCounter <= 0;
    end else begin //your functional code starts here, I just copied yours in with minor changes
        if (Enable)begin
            A[WriteCounter] <= dataIn; //note the use of delayed (<=) assignments - these are necessary when creating clocked logic
            //etc. etc.
        end
    end
end
始终@(posedge Clk)开始
如果(重置)开始//正同步重置
//将计数器重置为零

计数器我不能将其标记为重复,因为该问题并没有经过投票或接受的答案。答案是