欢迎来到天天文库
浏览记录
ID:57896209
大小:31.00 KB
页数:5页
时间:2020-09-02
《Verilog代码可移植性设计.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、标签:Verilog 代码可移植性 Verilog代码可移植性设计Verilog代码可移植性设计1. 参数定义localparam,实例代码如下:moduletm1( clk,rst_n, pout );inputclk;inputrst_n;output[M:0]pout; localparamN=4;localparamM=N-1; reg[M:0]cnt; always@(posedgeclkornegedgerst_n) if(!rst_n)cnt<=0; elsecnt<=cnt+1'b1;
2、 assignpout=cnt; endmodule 其实所谓localparam即localparameter(本地参数定义)。简单的说,通常我们习惯用parameter在任何一个源代码文件中进行参数定义,如果不在例化当前代码模块的上层代码中更改这个参数值,那么这个parameter可以用localparam代替。而localparam定义的参数是可以如parameter在上层文件中被更改的。具体的区别待parameter的用法实例后大家就能明白。parameter,实例代码如下:moduletm1 #(parameterN=4) (
3、 clk,rst_n, pout );inputclk; //外部输入25MHz时钟inputrst_n; //外部输入复位信号,低电平有效 output[M:0]pout; localparamM=N-1; reg[M:0]cnt; always@(posedgeclkornegedgerst_n) if(!rst_n)cnt<=0; elsecnt<=cnt+1'b1; assignpout=cnt; endmodule tm1.v的上层模块中,可以用lvdsprj.v模块中的方式对
4、其已经定义的parameter参数进行重新定义,而相应的localparam定义是不可以在lvdsprj.v模块中进行重新设定的。Lvdsprj.v模块的代码如下:modulelvdsprj( clk,rst_n, pout );inputclk;inputrst_n; output[M:0]pout; localparamN=5;localparamM=N-1; tm1 #(.N(5)) uut1( .clk(clk), .rst_n(rst_n),
5、 .pout(pout) ); endmodule 在verilog设计中,我们习惯将状态机的状态量用parameter来申明定义,它的适用范围通常是某个代码模块,或者其相关的上一层模块可对其进行重新申明定义。而如果工程中有多个模块里要用到同样的 2. 宏定义从定义方式上看,verilog语法中的宏定义和C还是略有区别,如verilog中的宏定义如下:`define M 5 在使用该宏定义值时,通常M应该表示为`M。之所以不是很提倡滥用宏定义,是因为它不像parameter那么“中规中矩”的作用有某几个特定的源代码文件中。
6、一旦`define被编译,其在整个编译过程中都有效,只有当遇到`undef命令才能使之失效。也即它通常会影响工程的其他模块,尤其当多个同样宏名定义时,如果不注意有可能照成定义的混乱。 3. 条件编译`ifdef、`else和`endif,这些编译指令用于条件编译,如下所示:`ifdefwindowsparameter SIZE=16`elseparameter SIZE=32`endif在编译过程中,如果已定义了名字为windows的文本宏,就选择第一种参数声明,否则选择第二种参数说明。`else程序指令对于`ifdef指令是可选的。条件编译其实是很有用的,尤其在代码移植过
7、程中。在工程中,如果我们编写某段代码逻辑(可能不止一段),而在实际应用中并不需要(或者只是作为调试使用,或者可能在别的工程中使用),通常的做法可能是将该部分逻辑进行注释。而当再次希望使用这部分代码的时候,一个常见的问题出现了,取消注释的时候往往可能不记得哪些逻辑是和这个功能块相关并被注释了。因此,这个时候条件编译就派上用场,可以省去我们很多的郁闷时间。特权同学过去对这个命令很不感冒,通常只是感觉很多有用的没用的代码在那里显得很紊乱,殊不知其实某些情况下它还
此文档下载收益归作者所有