1,Verilog 里面变量不叫变量,叫信号。 信号分两类: line 和 buffer。 对应组合逻辑和时序逻辑。要想保存状态,就得用时序逻辑。
2,Verilog里面所有变量跟时钟对齐。所以Verilog代码本质是并行运行的。 各信号之间只跟时钟对齐。
3,C语言是串行运行的,变量之间的逻辑关系可以通过指令顺序实现依赖。因此,只要跟算法逻辑对应就行了, 不用做专门的变量依赖和逻辑关系管理。例如:当后一条语句需要读一个变量的数据时,可以将待读取变量的状态改变语句放在状态读取语句前面。
4,Verilog变量状态只跟时钟对齐,所以不能通过指令顺序的方式实现状态依赖。因此,必须实现变量状态管理,这是在逻辑和代码上Verilog和C最大的区别,每个数据变量都得有对应的状态变量。代码逻辑主要体现在状态变量的管理上。
5,状态管理可以通过: 计数器和状态机来实现。 计数器实际上就对应C语言里面的for。状态机需要有状态改变触发条件,如果没有芯片外信号触发,基本上都时靠定时器触发状态改变。此时,状态机里的一个状态,可以认为对应C语言里的一个for语句块。
5,Verilog的另外一个难点是代码风格,Verilog主张每个信号一个always语句块,因为代码是并行的。所以在写代码时,并不能把相关联的逻辑代码放在一个always块中管理,一个算法要分布在很多个always块中,也即所谓的电路逻辑。并且,由于算法逻辑的关系,always语句块之间也不是绝对独立的,需要通过if来判断相关联信号状态来实现状态改变。这就给Verilog代码的阅读带来很大困难。
6,看透上述本质,其实Verilog程序的设计和代码阅读其实并不是很难。 只是需要先严格执行先设计、后编码的流程。不能像C语言那样可以写着看。想要实现Python里用Jupyter工具的状态更是不可能。所以写Verilog的人一定有很强的全局观。 这也是Verilog最优魅力的地方。