(在此处插入真正的基本问题免责声明)
更具体地说,我有以下声明:
output reg icache_ram_rw
在代码的某一点上,我需要将零值放在这个reg中。这是我尝试过的方法和结果:
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 )
我到底该怎么做呢?!
发布于 2009-11-28 02:01:07
assign
语句用于驱动wire
。
如果你有一些声明为reg
的东西,那么你必须在一个过程( always
或initial
块)中给它赋值。最佳实践是仅在同一个always
块中设置reg
的值。例如:
always @( * ) begin // combo logic block
if( some_condition ) begin
icache_ram_rw = 1'b0;
end else begin
icache_ram_rw = something_else;
end
您应该仔细阅读reg
和wire
之间的一些重要区别。
不过我有一种感觉,如果你在驱动RAM信号,你需要一些时钟逻辑。在这种情况下,您需要类似于以下内容的代码:
// 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
发布于 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大师
发布于 2009-12-04 07:39:08
请注意,您还可以在声明reg时为其分配初始值,如下所示:
output reg icache_ram_rw = 1'b0;
这将确保它在模拟中从零值开始。对于综合,您的结果将取决于综合工具和目标技术(对于FPGA,您通常可以为硬件分配初始值;对于ASIC,情况并非如此)。
https://stackoverflow.com/questions/1809749
复制相似问题