首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Verilog中为输出reg‘赋值’?

如何在Verilog中为输出reg‘赋值’?
EN

Stack Overflow用户
提问于 2009-11-28 00:52:53
回答 4查看 79.4K关注 0票数 2

(在此处插入真正的基本问题免责声明)

更具体地说,我有以下声明:

代码语言:javascript
运行
复制
output reg icache_ram_rw

在代码的某一点上,我需要将零值放在这个reg中。这是我尝试过的方法和结果:

代码语言:javascript
运行
复制
assign icache_ram_rw = 1'b0;
( declarative lvalue or port sink reg icache_ram_rw must be a wire )

icache_ram_rw <= 1'b0;
( instance gate/name for type "icache_ram_rw" expected - <= read )

我到底该怎么做呢?!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-28 02:01:07

assign语句用于驱动wire

如果你有一些声明为reg的东西,那么你必须在一个过程( alwaysinitial块)中给它赋值。最佳实践是仅在同一个always块中设置reg的值。例如:

代码语言:javascript
运行
复制
always @( * ) begin // combo logic block
   if( some_condition ) begin
      icache_ram_rw = 1'b0;
   end else begin
      icache_ram_rw = something_else;
 end

您应该仔细阅读regwire之间的一些重要区别。

不过我有一种感觉,如果你在驱动RAM信号,你需要一些时钟逻辑。在这种情况下,您需要类似于以下内容的代码:

代码语言:javascript
运行
复制
// some parameter definitions to make logic 'read' clearer.
localparam READ = 1'b0; 
localparam WRITE = 1'b1;

// standard clocked logic 'template' that synthesis tools recognise.
always @( posedge clk or negedge resetb )
  if( !resetb ) begin  // asynchronous active low reset
     icache_ram_rw <= READ;
  end else if( some_enable_condition ) begin
     icache_ram_rw <= WRITE;
  end else begin
     icache_ram_rw <= READ;
  end
票数 16
EN

Stack Overflow用户

发布于 2012-06-28 05:19:48

从输出声明中删除"reg“,代码就可以工作了(缺省为wire输出类型)。

大多数自学成才或自学成才的工程师在Verilog中发现很难理解两件事:(1)阻塞与非阻塞任务(请参阅我关于此主题的论文:http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf)和(2) reg -vs- wire。让我们现在就把后一个话题讲清楚。

左侧(LHS)或过程赋值(always、initial、task、function)上的任何内容都必须声明为变量类型(通常为reg)。语言中的其他一切都是一张网(通常是一条线)。没有例外。事情真的就这么简单。我不知道有哪本Verilog书能这么简单地说明这一点。

怎么会出这事?我问Phil Moorby,他是Verilog语言的好朋友和发明者,“为什么是reg?”Phil告诉我,当他发明Verilog时,还没有合成工具,他认为来自always块的所有东西都将是一个寄存器。他错了,现在我们只能用这个"reg“关键字了。

十多年来,我一直试图在Veirlog和SystemVerilog委员会上改变这一点。我想把所有东西都声明为wire,第一次使用将决定" wire“的行为是像reg一样(来自程序块的第一个赋值,最后一个赋值获胜),还是像wire一样(第一个赋值来自驱动源,比如模块输出或连续赋值,多个驱动被解析,就像今天在Verilog中那样),对同一个信号同时进行过程赋值和驱动赋值是非法的。遗憾的是,我在委员会中没有获得足够的票数来成功通过这项提案。

这是我在自己的代码中最常犯的错误。只需习惯错误消息,如“非法的LHS分配”或“非法分配给连接”。它们都是一样的意思,你忘了申报你的规则。

致敬- Cliff Cummings - Verilog & SystemVerilog大师

票数 31
EN

Stack Overflow用户

发布于 2009-12-04 07:39:08

请注意,您还可以在声明reg时为其分配初始值,如下所示:

output reg icache_ram_rw = 1'b0;

这将确保它在模拟中从零值开始。对于综合,您的结果将取决于综合工具和目标技术(对于FPGA,您通常可以为硬件分配初始值;对于ASIC,情况并非如此)。

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

https://stackoverflow.com/questions/1809749

复制
相关文章

相似问题

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