首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞赋值在Verilog中的使用

非阻塞赋值在Verilog中的使用
EN

Stack Overflow用户
提问于 2018-06-08 17:41:09
回答 2查看 90关注 0票数 0

以下示例(在state == 2'b01中)中的非阻塞赋值用法有效吗?它的模拟效果很好,但如何合成呢?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-08 18:48:18

  1. 非阻塞赋值(<=)是对顺序逻辑建模的合适方法。
  2. 您所显示的代码意味着:如果当前状态为01,则从addr开始的64个内存位置中的任何一个等于a,则下一个状态将为00,否则将为<代码>D9。

如果这是您想要的,则代码是正确的。

票数 2
EN

Stack Overflow用户

发布于 2018-06-08 18:00:06

您的非阻塞使用是可以的,但是您同时读取了64个内存值。

请参阅我的答案Here,关于HDL和循环,以及在合成时循环会发生什么。

除非你有64个端口的内存,否则你不能这样做。您的工具可能会构建它,但它可能会使用32768个寄存器,而不是内存。如果这个工具非常非常聪明,它可能会将你的设计分成64个存储器,每个存储器有64个条目。

如果这是你需要的功能,我会自己把内存分成64块,同时读取全部64块。

顺便说一句:如果你在构建一个缓存,这不是你应该做的。通常情况下,你会有一个标签内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50757736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档