wire型、reg型变量:
Verilog中何时要定义成wire型,何时定义成reg型?
大体来说,变量要放在begin...end之内,则该变量只能是reg型;在begin...end之外,则用wire型。以下是具体情况:
1:assign语句
例:assign out = a;
out必须是线性,若为寄存器型则报错。
2:元件实例化时必须用wire型
寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动
`timescale 1ns/1ns
写在所有仿真文件(.v)的代码首行,时间尺度、精度单位定义,时间尺度预编译指令,用来定义模块仿真时的时间单位和时间精度,不可被综合,但在可综合代码中也可以写,只是会在仿真时表达效果,而综合时会自动被综合器优化掉。
parameter、localparam、#(parameter)
parameter用在模块内部时和localparam作用类似,即定义一个参数常量
parameter CNT1 = 8'd999;
localparame CNT2 = 8'd999;
#(parameter)定义在模块开始处,如下:
module test
#(
parameter CNT = 8'd999
)
(
input a,
input b,
output c
);
...
...
...
endmodule
#(parameter)同样是定义了一个参数常量,但在实例化时,可在上层文件上修改该参数常量的值,而不修改底层文件,如下:
test
#(
.CNT (99)
)
test_inst
(
.a (a_inst),
.b (b_inst),
.c (c_inst)
);
这样,例化后的参数常量CNT取值为99。