Verilog中非阻塞分配的使用
以下示例(在Verilog中非阻塞分配的使用,verilog,Verilog,以下示例(在状态==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
状态==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
模块测试(输入线[7:0]a,输入线clk,输出调节[11:0]b);
reg[1:0]状态;
注册[7:0]成员[0:4095]
整数i;
始终@(posedge clk)开始
如果(状态==2'b00)开始
//一些逻辑
结束
否则如果(状态==2'b01)
状态您的非阻塞使用是正常的,但您同时正在读取64个内存值
请看我关于HDL和循环的回答,以及合成时循环会发生什么
除非你的内存有64个端口,否则你不能这样做。您的工具可能会构建它,但它可能会使用32768个寄存器,而不是内存。如果这个工具非常非常聪明,它可能会把你的设计分成64个内存,每个内存有64个条目
如果这是您需要的功能,我会将内存拆分为64个块,同时读取所有64个
顺便说一句:如果你建立了一个缓存,那就不是这样做的。您通常会有一个标记内存 非阻塞使用正常,但同时读取64个内存值
请看我关于HDL和循环的回答,以及合成时循环会发生什么
除非你的内存有64个端口,否则你不能这样做。您的工具可能会构建它,但它可能会使用32768个寄存器,而不是内存。如果这个工具非常非常聪明,它可能会把你的设计分成64个内存,每个内存有64个条目
如果这是您需要的功能,我会将内存拆分为64个块,同时读取所有64个
顺便说一句:如果你建立了一个缓存,那就不是这样做的。您通常会有一个标记内存
非阻塞分配(
非阻塞分配(是的。这正是我希望我的代码/硬件做的(同时比较64个值并决定相应的状态)。是的。这正是我希望我的代码/硬件做的(同时比较64个值并决定相应的状态)。只需确保在每个可能的路径中设置状态。@samuelnj为什么?如果没有在一个路径中显式设置,则在下一个时钟周期中与当前时钟周期中保持相同。不需要state True,它不是显式必需的,但我认为在Verilog中这是一个很好的做法,因为在非顺序块中否则会导致ce意外锁存。只需确保在每个可能的路径中设置状态。@samuelnj为什么?如果没有在一个路径中显式设置,则在下一个时钟周期中与在当前时钟周期中保持相同。不需要state True,这不是显式必需的,但我认为这在Verilog中是一种很好的做法,因为在非连续的路径中不这样做ial块可能会引入意外锁存。