首页 > 编程知识 正文

js预编译,fpga verilog

时间:2023-05-03 15:22:51 阅读:169934 作者:3145

Verilog预编译

Verilog语言支持宏定义` define、参数参数、本地参数` localparam、` include等内容。 对这些数据常数的支持对于数字系统的设计、模拟和验证非常有用。 这些参数是预编译的。

预编译

预编译是指在系统编译之前,先扫描系统文件,将文件中的引用宏和参数替换为实际值,然后将对` include文件的引用复制到相应的位置,再对其进行顺式编译例如,c语言、c语言等。

宏的定义

` define关键字

宏定义的关键字是` define,在预编译阶段,` define用于文本替换,类似于c语言的#define。 ` define命令定义后,将在整个翻译过程中生效。 例如,在文件中定义:

` define DATA_DW 32 //意味着DATA_DW=32,在制作文件时使用` DATA_DW,在系统编译时,首先将所有` DATA_DW出现的地方放在32

也可以直接在其他文件中使用` DATA_DW。 当然,根据编译工具的设置,建议仅在该文件中使用为一个文件定义的宏。

使用宏的优点是全局使用宏中定义的常量。 将来,通过直接更改宏的定义,可以更改使用宏的所有位置。

宏定义也可以是以下表达式:

` definelow_pos(w,b ) ) w ) *64(b ) )8) )

例如:

设计文件mul8.v

` define pw8module mul8(input (pw-1:0 ) a、input (pw-1:0 ) b、output (pw *2- 13:0 ) p ); assign p=a * b; 结束模块

模拟文件tb.v

` timescale 1 ns/1 ps

` define PW 8

module tb

);

参数期间=10;

reg CLK;

初始

比根

CLK=1'b0;

(#(PERIOD/2 );

四人合唱团

#(Period/2 ) CLK=~CLK;

结束

reg [`PW-1:0] a、b;

wire [`PW*2-1:0] p;

初始

比根

a=`PW'b0;

b=`PW'b0;

结束

always @(posedge CLK )

比根

a=a 1;

对于if(a==2** ) ` pw )-1 ) /幂算子) *,只能取2的幂,指数部//分必须为常数

b=b 1;

结束

mul8 mul8_dut

. a(a )指:

. b(b ),

. p(p )

);

结束模块

` undef关键字

` undef关键字允许您中止当前宏常量的定义。

例如` undef PW

文件在此句后不能用` PW代替8。

` ifdef,` ifndef,` elsif,` else,` endif

` elsif,` else编译指令对于` ifdef指令是可选的,只需` ifdef和` endif就可以构成一次条件编译指令块。

示例:默认处理32位数据,如果定义了宏,则根据宏定义进行处理

` ifdef DATA_DW

reg [`DATA_DW-1:0] data_a;

reg [`DATA_DW-1:0] data_b;

reg [`DATA_DW-1:0] data_c;

` else

reg [31:0] data_a;

reg [31:0] data_b;

reg [31:0] data_c;

` endif

注:宏通常在定义时可以同时使用大小写。 此外,它们是区分大小写的。 这意味着以大写形式定义的宏和以小写形式定义的宏只区分大小写,但表示不同的宏

例如:

由` define data_w 8和` define DATA_W 32定义的宏可以区分使用而不相互冲突。 一般的习惯宏是大写的。

参数参数和局部参数localparam

参数常数可以在parameter和localparam中定义,但使用范围不同。

localparam定义的参数只能在本模型内部使用,不能调用模块实例化,相当于局部常量。 状态机状态常量已定义,只能在定义的位置之后使用。

在parameter中定义的参数不仅在本文档中使用,还在module中实例化并传递参数。 parameter经常用于module界面和在设计文件中的多个位置使用特定常量的地方。

例如:

设计文件para_fadder.v

module para_fadder

# (

参数wdth=4

输入ci,

input [WDTH-1:0] a、

input [WDTH-1:0] b,

output [WDTH-1:0] sum,

输出co

);

assign {co,sum}=a b ci;

结束模块

Testbench文件tb.v

` timescale 1ns/1ps

module tb

);

参数wdth=16;

reg ci;

reg [WDTH-1:0] a、b;

wire [WDTH-1:0] sum;

wire co;

初始

比根

a='b0;

b='b0;

ci=0;

#10

a='d100;

b='d33;

ci=0;

#10

a='d101;

b='d37;

ci=1;

结束

para_fadder

# (

. wdth(wdth )

para_fadder_dut

. ci(ci )、

. a(a )指:

. b(b ),

. sum(sum )、

. co (二氧化碳)

);

结束模块

Modelsim模拟波形

说明:如果在设计文件中定义了参数WDTH=4,并且在实例化中传递的参数为16,则最终传递到设计文件的参数的特定数值取决于传递的值。 在本例中,WDTH的最终值为16,最终实例化16位全加法器。 如果实例化未将值传递给参数,则WDTH=4为缺省值,即实例化4位全加法器。 例如,以下内容:

para_fadderpara_fadder_dut(.ci )、 a(a )、 b )、 sum )、 co );

例子化为4位的全加法器。

模块参数的格式如下。

设计文件

module para _ fad der # (parameter wdth=4,parameter WDTH1=4 //最后一个参数没有分隔符)

多个参数由逗号“,”分隔,最后一个参数没有分隔符。

实例化端的相似格式:

para_fadder#(.wdth ), wdth1) )

如果只有一个参数

para_fadder#(.wdth ) (wdth ) )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。