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块可能会引入意外锁存。