序列检测状态机fsm的DUT和Testbench编写过程

 

状态机常是用来描述电路中某些特定元器件在工作的时候所涉及到的状态转变以及条件。其是目前在硬件描述中应用最广泛的一种操作模型之一,几乎每一个数字系统都可以被定义成一个状态机。这里以一个序列检测的例子简单说明状态机编写的思考过程。

  • 在编写状态机的时候,有两个要点的地方
  • 第一点:确定整个转变过程中的状态个数,确定用于储存状态的寄存器的位数。这里通过分析确定了电路运行存在的9种状态,所以需要使用一个4位的存储器来储存状态。
  • 第二点:确定次态的状态转变条件并绘制状态转变图,对于moore型状态机,其次态由当前态以及输入确定。所以这里使用case语句,分别列出每一种当前态的情况,并使用if … else … 判断输入信号的值,确定次态的情况。

DUT

  • 首先确定接口信号,这里共有4个接口信号,3个输入,1个输出。
  • 通过parameter关键字定义状态机中流动的状态值,通过分析确定状态机中会存在9种状态。
  • 通过reg定义状态机中储存状态元器件以及其位数。
  • 随着输入值的改变,当前状态(curr_state),次状态(next_state),输出(output)均会受到影响。可以输入值条件分别确定这几种情况的改变。
  • curr_state: 当rstn稳定的时候,对于curr_state是当时钟上升沿来的时候就将next_state赋值过去 curr_state = next_state;
  • next_state: 当时钟上升沿到来的时候就结合当前状态以及输入值综合确定出next_state的值。case语句(curr_state) + if…else条件判断(in_seq输入值)。
  • out: 对于moore型状态机其值只由当前状态确定。因此这里是当前序列为10010以及10010010时输出值out变为1.

Testbench

  • 这里按照常规定义接口,例化DUT,产生时钟信号,使用initial…begin语句生成激励。
  • 需要注意的时候,这里初始声明的data是一个20位的数据,而我们的状态机每一次输入是一个bit, 所以需要每次从20位数据中依次读取出一位数据。这里声明了一个integer i来记录下一次读取的位置。也可以使用连接的形式来完成相同的目的。如 data = {data[19:0], data[20]}每一次都将第一位拿到最后一位,然后使用data[20]就可以依次读取出整个data序列了。

本文原创,错误之处在所难免!盼指出!