2009-11-27 215 views
1

(插入很基本的问题在这里声明)如何在Verilog中将值分配给输出寄存器?

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

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) 

我该怎么做呢?

回答

13

assign声明用于驱动wire s。

如果你已经声明一个reg,那么你必须在程序中给它赋值(alwaysinitial块)。最好的做法是只在相同的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 S和wire s表示你应该读了之间的重要区别。

我有一种感觉,虽然你需要一些时钟逻辑,如果你正在驾驶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 
+0

感谢您的完整答案!钟控逻辑的确出现在赋值中,为了简单起见,我在这里省略了它(原来可能最好添加它)= D – 2009-12-08 14:49:11

3

请注意,您也可以在声明它分配初始值,一个reg,像这样:

output reg icache_ram_rw = 1'b0;

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

20

从输出声明中删除“reg”,代码应该工作(默认为导线输出类型)。 (1)阻塞-vs-非阻塞任务(请参阅我关于此主题的论文:http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf)和(2)reg - 阻塞任务vs-线。现在我们来澄清后面的话题。

左侧(LHS)或程序性任务(始终,初始,任务,函数)上的任何内容都必须声明为变量类型(通常为reg)。语言中的其他一切都是网络(通常是电线)。没有例外。这真的很简单。我不知道任何Verilog书籍只是简单地说。

这是怎么发生的?我问Verilog语言的好朋友和发明者Phil Moorby,“为什么注册?”菲尔告诉我,当他发明了Verilog时,没有合成工具,他认为从一个总是块出来的东西都将成为注册表。他错了,现在我们坚持使用这个“reg”关键字。

我试图在Veirlog和SystemVerilog委员会上修改了十多年。我想将所有内容都声明为wire,并且第一次使用将确定“wire”行为是否像reg(来自过程块的第一个赋值和最后一个赋值获胜),或者行为像电线(第一个赋值来自驱动源,例如模块输出或连续分配和多个驱动程序的解决方法与今天的Verilog相同),并且对同一信号进行过程分配和驱动程序分配都是非法的。唉,我还没有得到足够的委员会投票权来通过这个提案。

这是我在自己的代码中经常犯的错误。只是习惯于错误消息,如“非法LHS分配”或“非法分配线路”。他们都是同一件事,你忘了宣布你的regs。

问候 - 克里夫卡明斯 - Verilog的& SystemVerilog的大师

0
  1. 的问题是,当sythesized将创建端口/引脚多数民众赞成在赋值语句为什么它需要的电线作为输出。
  2. 您已经创建了现在被命名icache_ram_rw了reg的寄存器不一样的销权
  3. ....
  4. 所以要分配一个注册需要使用的Verilog
  5. 的Verilog的正确格式允许相同的使用始终语句,创建一个DFF,并且该DFF的输入引脚将为您的icache_ram_rw,格式已由其他人提供。