参数( parameters 用参数声明一个可变常量,常用于定义延时及宽度变量。 参数定义的语法: parameter< <list of assignment 可一次定义多个参数,用逗号隔开。 在使用文字( literal的地方都可以使用参数。 参数的定义是局部的,只在当前模块中有效。 参数定义可使用以前定义的整数和实数参数。 module mod1( out, inl in2)i 注意:参数fle不是 string 而是一个整数,其值是所有 parameter cycle 20, prop del 3 setup cycle/2 字母的扩展ASCI值。若 prop del fle=“AB”,则fle值为 1=8 8h4142。用法 x word=16′bx, usrl/ dough/ Fopen(file); design/ mem file. dat"; Display(“%s”,file); wire [pl: 0] w1;//A wire declaration using parameter endm。du1
参数(parameters) • 用参数声明一个可变常量,常用于定义延时及宽度变量。 • 参数定义的语法:parameter <list_of_assignment>; • 可一次定义多个参数,用逗号隔开。 • 在使用文字(literal)的地方都可以使用参数。 • 参数的定义是局部的,只在当前模块中有效。 • 参数定义可使用以前定义的整数和实数参数。 module mod1( out, in1, in2); . . . parameter cycle = 20, prop_ del = 3, setup = cycle/2 - prop_del, p1 = 8, x_ word = 16’bx, file = "/ usr1/ jdough/ design/ mem_ file. dat"; . . . wire [p1: 0] w1; // A wire declaration using parameter . . . endmodule 注意:参数file不是string, 而是一个整数,其值是所有 字母的扩展ASCII值。若 file=“AB”,则file值为 8‘h4142。用法: $fopen(file); $display(“%s”, file);
参数重载( overriding Defparam语句(现在综合工具还不支持) ·可用 defparam语句在编译时重载参数值。 · defparam语句引用参数的层次化名称 使用 defparam语句可单独重载任何参数值。 module test module modl( out inl, in2)i mod1工1(out,in1 parameter pl =8, in2) real constant defparam 2.039 I1.p1=6, x word=16′bx 工1.f立1 f主1e my mem. dat /usrl/dough/design/mem file. dat" endmodule endmost⊥e
参数重载(overriding) • 可用defparam语句在编译时重载参数值。 • defparam语句引用参数的层次化名称 • 使用defparam语句可单独重载任何参数值。 Defparam语句(现在综合工具还不支持) module mod1( out, in1, in2); . . . parameter p1 = 8, real_constant = 2.039, x_word = 16’bx, file = "/usr1/jdough/design/mem_file.dat"; . . . endmodule module test; . . . mod1 I1( out, in1, in2); defparam I1. p1 = 6, I1. file = "../ my_mem.dat"; . . . endmodule
参数重载( overriding 模块实例化时参数重载 module mod1( out, inl in2) 因为#说明延时的时候只能用 于gate或过程语句,不能用于 parameter pl =8 模块实例。 real constant 2.039 x word=16′bx, gate( primitives)在实例化时只 file /usrl/dough/design/mem file. dat"; 能有延时,不能有模块参数。 endmodule 次序与原说 module top; 明相同 od15,3.0,16′bx,".,/mymm 工1(。ut 使用# 2) 为什么编译器认 endmodule 为这是参数而不 是延时呢?
参数重载(overriding) module mod1( out, in1, in2); . . . parameter p1 = 8, real_constant = 2.039, x_word = 16’bx, file = "/usr1/jdough/design/mem_file.dat"; . . . endmodule module top; . . . mod1 #( 5, 3.0, 16’bx, "../ my_mem. dat") I1( out, in1, in2); . . . endmodule 模块实例化时参数重载 使用# 次序与原说 明相同 不需要给所有参数赋新值,但不 能跳跃赋值,假设模块MOD顺序 定义三个参数a, b, c,则: MOD u1 #( a, b) (...); MOD u2 #(a) (...); MOD u3 #(a, ,c) (...); MOD u4 #(, b, c) (...); 为什么编译器认 为这是参数而不 是延时呢? 因为#说明延时的时候只能用 于gate或过程语句,不能用于 模块实例。 gate(primitives)在实例化时只 能有延时,不能有模块参数
寄存器数组( Register arrays 在 Verilog中可以说明一个寄存器数组。 integer NUMS[7:01;//包含8个整数数组变量 time t vals [3:0]; /4个时间数组变量 reg类型的数组通常用于描述存储器 其语法为:reg[MsB:LsB]< menory nane> [first addr: last addr]i [MsB:sB]定义存储器字的位数 [ first addr:1 ast addr]定义存储器的深度 例如 reg[15:0]MEM[0:1023];//1Kx16存储器 reg[7:0PRP[ hFFFE: hFFFF];//2x8存储 器 描述存储器时可以使用参数或任何合法表达式 parameter wordsize 16; parameter memsize 1024; reg [wordsize-1: 0] MEM3 [memsize-1l:0]i
寄存器数组(Register Arrays) • 在Verilog中可以说明一个寄存器数组。 integer NUMS [7: 0]; // 包含8个整数数组变量 time t_vals [3: 0]; // 4个时间数组变量 • reg类型的数组通常用于描述存储器 其语法为:reg [MSB:LSB] <memory_name> [first_addr:last_addr]; [MSB:LSB]定义存储器字的位数 [first_addr:last_addr]定义存储器的深度 例如: reg [15: 0] MEM [0:1023]; // 1K x 16存储器 reg [7: 0] PREP [‘hFFFE: ’hFFFF]; // 2 x 8存储 器 • 描述存储器时可以使用参数或任何合法表达式 parameter wordsize = 16; parameter memsize = 1024; reg [wordsize-1: 0] MEM3 [memsize-1: 0];
存储器寻址( Memory addressing) 存储器元素可以通过存储器索引( index)寻址,也就是给出元素在存储器的 位置来寻址。 mem name [addr expr] Verilog不支持多维数组。也就是说只能对存储器字进行寻址,而不能对存 储器中一个字的位寻址。 module mems eg [8: 1] mema [0: 255]; // declare memory called mema reg [8: 1] mem word; // temp register called mem word ini七ia1 若要对存储器字的某些位存取 begin 只能通过暂存器传递 sdisplayb( mema [51)i //显示存储器中第6个字的内容 mem word mema [5] display( mem word[8]);////显示第6个字的最高有效位 endmodule
存储器寻址(Memory addressing) • 存储器元素可以通过存储器索引(index)寻址,也就是给出元素在存储器的 位置来寻址。 mem_name [addr_expr] • Verilog不支持多维数组。也就是说只能对存储器字进行寻址,而不能对存 储器中一个字的位寻址。 module mems; reg [8: 1] mema [0: 255]; // declare memory called mema reg [8: 1] mem_word; // temp register called mem_ word . . . initial begin $displayb( mema[5]); //显示存储器中第6个字的内容 mem_word = mema[5]; $displayb( mem_word[8]); // //显示第6个字的最高有效位 end endmodule 若要对存储器字的某些位存取, 只能通过暂存器传递