1031
这个带来了一个问题。
据说米德体系下面早期是用时标来做。
1ns,1ms,1ps,用时标来做。
这个时候时标由设计者来决定。
可是时标选大了不合适,选小了CPU的开销非常大,这个CPU每时每刻都要来处理这段行为。
所以在米德体系下面就想了一个办法,仅仅在需要的时候,仅仅由设计者来决定,需要的时候,非综合目的,让它来执行它。
所以说列出来@信号敏感表,在信号敏感表里面的信号发生变更的时候,非综合目的才来处理它。
这个时候,CPU的开销就很小了。
就是信号敏感表里面的信号发生变更的时候。
所以说在VHDL,严谨的EDA的体系下面,信号敏感表是和综合无关的。
1032
Moorby的体系一开始也是这么做的,也发现了同样的问题。
所以说Moorby也加上去了,但是呢,他的团队又没有完全注意到以前的米德的思想,就是综合跟信号敏感表无关。
它有关了。
它是怎么做的呢?
它是把信号敏感表里面列出了沿敏感信号,如果信号敏感表里面列出了有且有一个沿敏感信号。
这个叫什么名字不重要,重要的是它没有出现在begin块里面。
有且有一个沿敏感信号未被引用,它说这个时候综合器才真正地会综合出一个寄存器来。
我们把它的begin块里面全部写成FA。
被引用的是输入,被驱动的是输出。
那么你写FA,综合就会得到FA。
FA被引用的是输入,被驱动的是输出。
1033
如果信号敏感表里面,有且有一个沿敏感信号未被引用。
有两个未被引用不是,是跨时钟域。
没有沿敏感信号不是,是电平敏感。
有且有一个未被引用,那么Moorby他会送你一个寄存器。
他是这么做的。送一个寄存器。
你在这个FA里面,凡是在FA里面的输出信号,都会被这个寄存器捕获了以后,用这个时钟,唯一的一个未被引用的沿敏感信号,用它驱动。
所以说呢,这个就是CSS讨论,这样写代码,就一定会综合出这个结构,他一定会送你一个寄存器。
并且我们称之为开节点。
开节点、闭节点是同步电路的范畴。
在这里面作为它的基础,我们已经做过介绍。
1034
那么这样的话呢,用一个always语句块,写这个架构,称之为一段式。
两个,两段式。
三个,三段式。
然后呢,我们来看,写代码的时候,这段代码里面,被引用的信号是输入,被驱动的信号是输出。
称之为它的代码模型。
这是它的理论模型。
然后我们看它的一段式的代码模型。
代码里面,被引用的是输入,被驱动的是输出。
那么我们称之为闭节点。
一段的代码模型。就是用一个always语句块来写。
Begin块里面,哪些信号被引用了?
哪些信号被驱动了?
被引用的信号应该出现在赋值号的右侧,if、case的括弧里面。
被驱动的信号应该出现在赋值号的左侧。
如果是沿敏感,这个应该是非阻塞。
我们现在至芯的教学一直沿用的是经典的,好,它应该是怎样的代码模型。
1035
在一段里面,那个state,既会被引用,又会被驱动,是不是?
我们只需要声明一个state,因为那个NS看不到的。
就一个CS。
这个之间的装配关系我就不做复习了。
我就把代码模型写一下。
NS没有,就一个CS。
既然是CS,我们就称之为state。
所以说一段式的时候,我们总是写state。
这个state呢,我们写在代码里面,我们会写成case (state),这个state是被引用的。
然后呢,我们会驱动它,在哪个状态下面,state被转到什么地方?
所以state又是输出。
对于它而言,就是它的两个端口,一个是state的输入端口,是出现在case语句里面。
1036
一个是它的输出端口。
输入被引用,输出被驱动。
是它的两个端口,只不过同名而已。
同名就意味着什么呢?
在这个代码块所处的上层,是同一个信号,形成迭代。
由于是闭节点,允许迭代。
所以说,state,一段式,它一定是它的两个端口。
一个是被引用的输入端口,一个是被驱动的输出端口。
然后呢就是状态机的信号,状态机给出的输入信号。
状态机给出的输出信号。
这两个信号之间也允许迭代。
一个经典的例子就是那个cnt。
1037
Cnt,既引用了它,又驱动了它。
复位的时候,我们会让cnt=0,然后呢,我们可能会写成cnt=cnt+1这种形式,既出现在赋值号的左侧,是被驱动的信号。
又出现在赋值号的右侧,是输入信号。
所以说,它有可能会形成迭代,是允许的。
某些信号是允许迭代的。
因为它是闭节点,这个呢,就是一段的代码模型,这个我们应该很熟悉了。
我们至芯的课程,我们一直强调,我们三段都能够非常自由地转换了。
1038
你能写一段,你就能写两段,就能写三段。
应该很容易的。
这是一段。
两段是用两个always语句块来写。
两个always语句块的代码模型,第一段是一个闭节点,打两撇我们表示闭节点,这是状态机的两段的第一段。
我注意到国内有一些EDA的工程师,对基础的理论引进的不够,或者是他们的阅读量不够,一段的写法,有各种写法。
我们至芯的同学写的比较规范,跟国际比较接轨。
如果你不知道这个模型,你就会在一段里面还写复位,还写控制。
1039
它一段的模型就是这样。
输入的是NS,输出的是CS。
它没有别的信号。
在这个循环行为体里面,只有一个NS是输入,只有一个CS是输出。
在这个begin end块里面,只有一个信号被驱动了,就是CS。
它写的就是这个模型的寄存器。
如果你用其它的方式写,你就得不到这个模型了。
没有这个模型,就得不到状态机的性能支持了。
那就不是状态机了,可以说。
然后是第二段,第二段是开节点。
开节点输入CS,输出NS。
1040
然后是现场的输入,现场的输出。
引用的是输入,驱动的是输出。
当做两段的时候,是把这个部分,REG放进来,然后呢,写它的描述的时候呢,是用开节点写。
开节点就是种瓜得瓜种豆得豆。
当然会写ST,放到上面,把摩尔或者米利放到上面。
那么就会得到对应的结构。
这个是开节点的输出,所以说呢,开节点的输出是一个完备的、充分必要的理论级的模型。
就是理论级模型里面的框架、部件,它一个不多一个不少。
但是一段、三段,都会多出一个输出寄存器,在米粒和摩尔后面多出一个输出寄存器。
