如何使用组合逻辑中的内存合成verilog代码。?
我使用Verilog代码组合逻辑中的缓冲区,我尝试使用spyglass合成工具合成Verilog代码。但我做不到。 显示 错误:为信号缓冲器A、缓冲器B推断闩锁 我在下面附上我的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
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)开始
如果(重置)开始//正同步重置
//将计数器重置为零
计数器我不能将其标记为重复,因为该问题并没有经过投票或接受的答案。答案是