RTL级建模的基本思想
0赞
发表于 2012/2/25 8:17:50
阅读(20920)
RTL级建模的基本思想
任何计算机语言都是人与计算机交流的一种载体,就像我们和美国人交流一样,大家要用一种双方都能识别的语言作为表达方式才能将我们的意思告诉对方。Verilog HDL语言所扮演的也是这么一种角色。我们给它定义一些语句(如if…else等),让这些语句代表一些特定的意思,然后相应的EDA工具可以识别这些语句,并可以进行相应的行动(如综合、仿真等)。
在这个过程中,最重要的当然是人的思想了,毕竟语言所提供只是一种途径,verilog程序最终表达的是人的想法,所以,过多的争论什么语言好什么语言不好并没有太多的意义,不同的语言之间的优劣只是在于是否该语言能够提供足够多的元素去完整及方便地表达人的思想。
RTL级的verilog其实也就是我们常说的verilog语言中可综合的那部分,它是verilog语言的一个子集。所谓的RTL级建模,其实也就是用verilog语言去描述实际电路的行为,比如用verilog语言去描述一个ram或者是一个移位寄存器。
对于这个层次上的建模,最重要的思想就是“硬件意识”,也就是说,我们在写代码的时候,大脑里要先知道我们设计的是什么样的电路,然后再用verilog语言将它描述出来。其实,在出现硬件描述语言之前,电路设计都是用原理图去搭的,这种设计过程也是我们心中先有了电路,然后用一种计算机能够识别的方式进行描述,现在的verilog HDL只是相当于我们有了更先进的描述方法,但是在RTL级的设计过程还是不变----心中先有电路,再将它翻译成verilog代码。
刚才我们说了,RTL的设计其实就是用verilog去描述电路的行为,那么,我们要怎么去理解这个“电路的行为”呢?
第一,电路在物理上是并行工作的。
我们知道,在写C程序的时候,由于CPU在任一时刻最多只能执行一条指令,程序都是顺序执行的,即使是我们平时说的多任务操作系统,所谓的并行任务也只是从宏观上来说的(人感觉不到而已),但从微观上来说它仍然是顺序执行的。所以我们设计C程序时思维是串行或者说是并行的。
但是数字电路设计则不然,数字电路芯片无非是由一些门电路和触发器组成,从物理上看,在任何时刻,芯片内部各部分电路都是同时工作的。所以在设计的时候,我们需要以一种并发的思维去思考。以下面例3-1为例:
例3-1:
always @(posedge clk or negedge rst_n)
begin
if ( rst_n == 1'b0 )
begin
wren <= 1’b0;
rden <= 1’b0;
end
else
begin
wren <= a&b;
rden <= c&d;
end
end
在综合成实际电路之后,wren和rden的赋值是同时进行的,并不会因为wren在rden前面就先对wren赋值(其实将赋值理解高低电平的传递会更好一些)。事实上,当综合成网表文件后,这种赋值的先后顺序也就不存在了。
第二,电路行为的先后顺序是通过时钟节拍去完成的。
在一些时候,我们需要完成这样的功能:在STATE0状态下,当事件A来了后,去触发状态STATE1;在状态STATE1下,外部总线上读取数据;在处理完后,又进入到状态STATE2,将数据突发传送到背板总线上,并回到STATE0。
这就有了一种逻辑上的先后关系,但是由于我们的电路都是并行工作的,我们不能像C语言的方式将代码在一个进程中按先后顺序排放后就可以完成功能。那我们要怎么去实现呢?我们知道,我们人类去判别先后顺序是按通过时间完成的,也就是说,如果我们是基于时钟节拍去设计的话----即在节拍n事件A到来,在节拍B进入状态STATE0,在n+1到n+k节拍中每x个节拍从外部总线上取一个数,在n+k节拍后,每一个节拍将缓存在FIFO的数据放到背板总线上,就可以实现这种逻辑的先后顺序。总结起来,就是电路行为的逻辑先后顺序是通过时钟节拍去体现的,设计时可以通过将事件安排在不同的时钟节拍去完成。
任何计算机语言都是人与计算机交流的一种载体,就像我们和美国人交流一样,大家要用一种双方都能识别的语言作为表达方式才能将我们的意思告诉对方。Verilog HDL语言所扮演的也是这么一种角色。我们给它定义一些语句(如if…else等),让这些语句代表一些特定的意思,然后相应的EDA工具可以识别这些语句,并可以进行相应的行动(如综合、仿真等)。
在这个过程中,最重要的当然是人的思想了,毕竟语言所提供只是一种途径,verilog程序最终表达的是人的想法,所以,过多的争论什么语言好什么语言不好并没有太多的意义,不同的语言之间的优劣只是在于是否该语言能够提供足够多的元素去完整及方便地表达人的思想。
RTL级的verilog其实也就是我们常说的verilog语言中可综合的那部分,它是verilog语言的一个子集。所谓的RTL级建模,其实也就是用verilog语言去描述实际电路的行为,比如用verilog语言去描述一个ram或者是一个移位寄存器。
对于这个层次上的建模,最重要的思想就是“硬件意识”,也就是说,我们在写代码的时候,大脑里要先知道我们设计的是什么样的电路,然后再用verilog语言将它描述出来。其实,在出现硬件描述语言之前,电路设计都是用原理图去搭的,这种设计过程也是我们心中先有了电路,然后用一种计算机能够识别的方式进行描述,现在的verilog HDL只是相当于我们有了更先进的描述方法,但是在RTL级的设计过程还是不变----心中先有电路,再将它翻译成verilog代码。
刚才我们说了,RTL的设计其实就是用verilog去描述电路的行为,那么,我们要怎么去理解这个“电路的行为”呢?
第一,电路在物理上是并行工作的。
我们知道,在写C程序的时候,由于CPU在任一时刻最多只能执行一条指令,程序都是顺序执行的,即使是我们平时说的多任务操作系统,所谓的并行任务也只是从宏观上来说的(人感觉不到而已),但从微观上来说它仍然是顺序执行的。所以我们设计C程序时思维是串行或者说是并行的。
但是数字电路设计则不然,数字电路芯片无非是由一些门电路和触发器组成,从物理上看,在任何时刻,芯片内部各部分电路都是同时工作的。所以在设计的时候,我们需要以一种并发的思维去思考。以下面例3-1为例:
例3-1:
always @(posedge clk or negedge rst_n)
begin
if ( rst_n == 1'b0 )
begin
wren <= 1’b0;
rden <= 1’b0;
end
else
begin
wren <= a&b;
rden <= c&d;
end
end
在综合成实际电路之后,wren和rden的赋值是同时进行的,并不会因为wren在rden前面就先对wren赋值(其实将赋值理解高低电平的传递会更好一些)。事实上,当综合成网表文件后,这种赋值的先后顺序也就不存在了。
第二,电路行为的先后顺序是通过时钟节拍去完成的。
在一些时候,我们需要完成这样的功能:在STATE0状态下,当事件A来了后,去触发状态STATE1;在状态STATE1下,外部总线上读取数据;在处理完后,又进入到状态STATE2,将数据突发传送到背板总线上,并回到STATE0。
这就有了一种逻辑上的先后关系,但是由于我们的电路都是并行工作的,我们不能像C语言的方式将代码在一个进程中按先后顺序排放后就可以完成功能。那我们要怎么去实现呢?我们知道,我们人类去判别先后顺序是按通过时间完成的,也就是说,如果我们是基于时钟节拍去设计的话----即在节拍n事件A到来,在节拍B进入状态STATE0,在n+1到n+k节拍中每x个节拍从外部总线上取一个数,在n+k节拍后,每一个节拍将缓存在FIFO的数据放到背板总线上,就可以实现这种逻辑的先后顺序。总结起来,就是电路行为的逻辑先后顺序是通过时钟节拍去体现的,设计时可以通过将事件安排在不同的时钟节拍去完成。