以下示例(在state == 2'b01中)中的非阻塞赋值用法有效吗?它的模拟效果很好,但如何合成呢?
module test(input wire [7:0]a, input wire clk, output reg [11:0] b);
reg [1:0] state;
reg [7:0] mem [0:4095]
integer i;
always @(posedge clk) begin
if(state == 2'b00) begin
//some logic
end
else if(state == 2'b01)
state <= 2'10;
for(i = addr; i < addr + 64; i = i+1)
if(a == mem[i]) begin
state <= 2'b00;
//some logic
end
end
end
else begin
//some logic
end
end
endmodule发布于 2018-06-08 18:48:18
<=)是对顺序逻辑建模的合适方法。01,则从addr开始的64个内存位置中的任何一个等于a,则下一个状态将为00,否则将为<代码>D9。如果这是您想要的,则代码是正确的。
发布于 2018-06-08 18:00:06
您的非阻塞使用是可以的,但是您同时读取了64个内存值。
请参阅我的答案Here,关于HDL和循环,以及在合成时循环会发生什么。
除非你有64个端口的内存,否则你不能这样做。您的工具可能会构建它,但它可能会使用32768个寄存器,而不是内存。如果这个工具非常非常聪明,它可能会将你的设计分成64个存储器,每个存储器有64个条目。
如果这是你需要的功能,我会自己把内存分成64块,同时读取全部64块。
顺便说一句:如果你在构建一个缓存,这不是你应该做的。通常情况下,你会有一个标签内存。
https://stackoverflow.com/questions/50757736
复制相似问题