VORC的PE仿真问题之二:reg数据类型和寄存器

来源:互联网 发布:mac迅雷下种子失败 编辑:程序博客网 时间:2024/04/25 21:53

VORC - Register模块仿真

仿真环境: ModelSim 6.2

源代码:     Veriolog

 

问题reg3、reg4、reg5等均为不定值,而在测试代码中初始化赋值为0。

原因从电路图中看,reg3是一个关键,它的值不确定,会导致接下来的多路选择器和加法器的输入数据不确定,这样在仿真时,就会出现大量的不确定值。为什么对reg 3赋初值为0,而在仿真波形中出现不定值x呢?推测原因是:reg3仅仅是定义的一个数据类型,而电路途中的REG3是一个实际的寄存器。

解决方法为REG3编写RTL代码,并在VORC中例化。

vorc 

图一 VORC的MAC(乘加运算功能)仿真波形(出错)

 

1、寄存器的RTL代码

VORC - Register模块带有使能信号但没有复位信号,而且该代码是可综合的。

Source code :

'timescale 1ns/1ns

module register_4 (clk, start, d, q);

    input clk, start;

    input [3:0] d;

    output [3:0] q;

   

    reg [3:0] q;

    

    always @ (posedge clk)

       if (start)

          q <= d;

       else

          q <= 0;

         

  endmodule   

 

Testbench :

'timescale 1ns/1ns

module register_4_tb; // (clk, start, d, q);

   reg clk;

   reg start;

   reg [3:0] d;

   wire [3:0] q;

  

   register_4 dut (clk, start, d, q);

  

   initial

      clk = 1;

   always

       #10 clk = ~ clk;

  

   initial

      begin

      d = 0;

      start = 1;

      end

 

   always

      #10 d = d + 1;

endmodule

ModelSim仿真波形:

 registered

图二 带使能的4位寄存器仿真波形

 

2、在VORC源代码中例化上面的寄存器,并仿真,其结果正确。

 

 MAC

图三 VORC乘加运算功能仿真波形

 

寄存器数据类型

寄存器是数据存储单元的抽象。

寄存器数据类型的关键字是reg。

通过赋值语句可以改变寄存器存储的值,其作用与改变触发器存储的值相当。在Verilog中有多种结构可以用于控制何时或是否执行赋值语句。这些控制结构可以用来描述硬件触发器的各种状态,如时钟的上升沿(posedge clk),或者用于描述判断逻辑的细节,如各种多路选择器。

Reg类型数据的默认初始值为不定值 X,可以赋正值或负值,但作为表达式中的操作数是,会将负值作为无符号数。

Reg 类型数据常用来表示"always"块内的指定信号,常代表触发器。通常,在设计中要由"always"块通过使用行为描述语句来表达逻辑关系。在"always"块内被赋值的每一个信号都必须定义为reg类型。

Reg数据类型的定义格式:reg [size-1:0] reg1, reg2,reg3;

Reg类型数据只表示被定义的信号将用在"always"块内。但reg类型的信号不一定是寄存器或触发器的输出。(设计中用到的寄存器要定义成相应的模块,而不能只是定义为reg类型)。

 

数据在寄存器中暂存

 

组合逻辑电路的输出与每一个输入信号的电平直接相关。严格来讲,它的输出在每一个瞬间都又可以发生变化,而同步时序逻辑电路的输出只在时钟跳变沿发生变化(always @ (posedge clk))。

由于实际的逻辑门和连线均存在延迟,实际的组合逻辑电路瞬间的输出值的不确定性是不可避免的。因此,为了获得稳定的输出值,要使组合逻辑电路的输入值稳定足够的时间。现实的方法是将数据暂存到寄存器中,这样数据就可以按照时钟节拍为下一级组合逻辑电路提供稳定的输入信号。

原创粉丝点击