首页计算机计算机工程硬件描述语言和数字系统设计 03 第3章 Verilog 基本语法.pptx

03 第3章 Verilog 基本语法.pptx

页数:71页文件大小:307.2 KB来源: 硬件描述语言和数字系统设计ppt课件

本课件讲解Verilog HDL的基本模块结构,包括端口信息、输入输出说明与功能定义,并说明空白符与注释、四值逻辑系统、常量、标识符与系统任务等词汇约定,以及常用数据类型与运算符的用法。

第3章Verilog基本语法章节封面,标示本章涵盖Verilog HDL基本模块说明、Verilog HDL中的词汇约定、Verilog HDL数据类型等内容
第3章主要内容,依次讲述Verilog HDL基本模块说明、Verilog HDL中的词汇约定、Verilog HDL数据类型等小节
Verilog HDL基本模块说明内容页,module能够表示: 物理块,如IC或ASIC单元 逻辑块,如一个CPU设计的ALU部分 整个系统
查看本课件的文字版(共 71 页,供检索与复制)

第1页:第3章Verilog基本语法

硬件描述语言和数字系统设计

第2页:第3章主要内容

Verilog HDL基本模块说明3.2 Verilog HDL中的词汇约定3.3 Verilog HDL数据类型3.4 Verilog HDL运算符主要内容:

第3页:Verilog HDL基本模块说明

Verilog HDL基本模块说明

  • module能够表示:
  • 物理块,如IC或ASIC单元
  • 逻辑块,如一个CPU设计的ALU部分
  • 整个系统
  • 每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。module是层次化设计的基本构件逻辑描述放在module内部

第4页:Verilog模块

(module)结构基本要素知识点:3.1.1端口信息3.1.2输入/输出说明3.1.3逻辑功能描述

第5页:端口信息

1,端口在模块名字后的括号中列出3,端口可以说明为input,output及inout2,端口等价于硬件的引脚(pin)

  • 模块通过端口与外部通信

第6页:module combination

Verilog模块的结构由在module和endmodule关键词之间的四个主要部分组成:-1.端口信息:modulecombination(a, b, c, d ); -2.输入/输出说明:input a, b, c; output d; -//输入/输出端口信号类型声明,缺省为wire型:-3.内部信号:wire x; -4.功能定义:assign d = a | x; assign x = ( b & ~c ); endmodule3.1.2端口说明;

第7页:逻辑功能描述

modulemux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a; endmodule两路选择器的RTL级描述1:;

第8页:module mux2to1 代码示例

两路选择器的RTL级描述2:modulemux2to1 (out, a, b, sel); input a, b, sel; output out; reg out; always @( sel or a or b)if (! sel) out = a; else out = b; endmodule;

第9页:module instances

  • .端口信息
  • 2.输入/输出说明
  • 3.逻辑功能描述(实例化实现功能描述)实例化(module instances):

第10页:modulemux2to1

(out, a, b, sl);input a, b, sl;output out;notu1 (nsl, sl );andu2 (sela, a, nsl);andu3 (selb, b, sl);oru4 (out, sela, selb);endmodule两路选择器的门级描述-实例化:

第11页:module block1 代码示例

  • 请在下面的空格中填入适当的符号使其成为右图的Verilog模块:module block1(a, b,—,—,—)
  • input—,—,—
  • ——d,—
  • assign d = a | ( b & ~c)
  • assign e = ( b & ~c )
  • _______练习:编写Verilog HDL模块abcde

第12页:module block1(续1)

moduleblock1(a, b,c,d,e); inputa,b,c; outputd,e; assign d = a | ( b & ~c); assign e = ( b & ~c ); endmodule练习答案:编写Verilog HDL模块abcde;

第13页:Verilog HDL中的词汇约定

Verilog HDL中的词汇约定知识点:

  • 3.2.1术语及定义
  • 3.2.2空白符和注释
  • 3.2.3 Verilog采用的四值逻辑系统
  • 3.2.4整数常量和实数常量
  • 3.2.5字符串
  • 3.2.6标识符
  • 3.2.7系统任务及函数
  • 3.2.8编译指导
  • 3.2.9文本包含
  • 3.2.10文本替换

第14页:术语及定义

1.空白符
空格、tabs及换行2.标志符(Identifier):Verilog中对象(如模块或信号)的名字3.LSB:最低有效位(Lease significant bit)4.MSB:最高有效位(Most significant bit)

第15页:空白符和注释

module MUX2_1 (out, a, b, sel);input sel;wire sel_, a1, b1; notnot1 (sel_, sel); andand1 (a1, a, sel_);andand2 (b1, b, sel); oror1 (out, a1, b1); endmodule格式自由使用空白符提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。多行注释,在内单行注释到行末结束;

第16页:Verilog采用的四值逻辑系统

’0’, Low, False, Logic Low, Ground,VSS,Negative Assertion‘1’, High, True, Logic High, Power,VDD, VCC, Positive Assertion’X’ Unknown: Occurs at Logical Which Cannotbe Resolved Conflict‘Z’, High Impedance, Tri-Stated,Disabled Driver (Unknown)

第17页:整数常量和实数常量

Verilog中,常量(literals)可是整数也可以是实数。1.整数的大小可以定义也可以不定义。整数表示为:<size>'<base><value>其中size:位数大小,由十进制数表示的位数(bit)表示。缺省为32位base:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制value:是所选数基内任意有效数字,包括X、Z。2.实数常量可以用十进制或科学表示法表示。

第18页:12unsized decimal

unsized decimal (zero-extended to 32 bits)‘h83aunsized hexadecimal (zero-extended to 32 bits)8'b1100 00018-bit binary16'hff0116-bit hexadecimal32'bz01xZ-extended to 32 bits3'b1010 11013-bit number, truncated to3’b1016.3 decimal notation32e-4 scientific notation for 0.00324.1E3 scientific notation for 4100整数与实数常量例子

第19页:整数和实数常量小结 整数的大小可以定义

整数和实数常量小结

  • 整数的大小可以定义也可以不定义。整数表示为:
  • 数字中(_)忽略,便于查看
  • 没有定义大小(size)整数缺省为32位
  • 缺省数基为十进制
  • 数基(base)和数字(16进制)中的字母无大小写之分
  • 当数值value大于指定的大小时,截去高位。如2'b1101表示的是2'b01
  • 实数常量
  • 实数可用科学表示法或十进制表示
  • 科学表示法表示方式:<尾数><e或E><指数>,表示:尾数×10指数

第20页:字符串

(string)(了解)

  • 字符串要在一行中用双引号括起来,也就是不能跨行。
  • 字符串中可以使用一些转义(escape)符,如\t\n可以使用一些格式符(如%b)在仿真时产生格式化输出:”This is a normal string””This string has a\t tab and ends with a new line\n””This string formats a value: val = %b”Verilog中,字符串大多用于显示信息的命令中。(只用在测试中!!!!)

第21页:格式符%t%s%c%b%d%o%

htimestringACSIIbindecocthex转义符\<1-3 digit octal number>\”\\\n\tASCII representation of above双引号反斜杠换行tab格式符%0d表示没有前导0的十进制数

第22页:标识符

(identifiers) (重点)

  • 标识符是用户在描述时给Verilog对象(电路模块、信号等)起的名字
  • 标识符必须以字母(a-z, A-Z)或( _ )开头,后面可以是字母、数字、( $ )或( _ )。
  • 最长可以是1023个字符
  • 标识符区分大小写,sel和SEL是不同的标识符
  • 例如:moduleMUX2_1(out, a, b, sel);outputout;inputa, b, sel;wire sel_, a1, b1;notnot1(sel_, sel);andand1(a1, a, sel_);andand2(b1, b, sel);oror1(out, a1, b1);endmoduleVerilog标识符

第23页:有效标识符举例

  • shift_reg_abusa_index_bus3
  • 无效标识符举例:34net

    第24页:系统任务及函数

    (了解)使用方式
    $<identifier>
    • $符号指示这是系统任务和函数
    • 系统函数有很多,如:
    • 返回当前仿真时间$time
    • 显示/监视信号值($display, $monitor)
    • 停止仿真$stop
    • 结束仿真$finish如:$monitor($time, “a = %b, b = %h”, a, b);当信号a或b的值发生变化时,系统任务$monitor显示当前仿真时间,信号a值(二进制格式),信号b值(16进制格式)。

    第25页:编译指导

    编译指导(了解)

    • (`)符号说明一个编译指导
    • 这些编译指导使仿真编译器进行一些特殊的操作
    • 编译指导一直保持有效直到被覆盖或解除

    第26页:文本包含

    `include (了解)

    • 编译指导`include在当前内容中插入一个文件格式:`include “<file_name>”如`include "global.v"`include "parts/count. v"`include "../../library/mux. v”
    • `include可用于:
    • include保存在文件中的全局的或经常用到的一些定义,如文本宏
    • 在模块内部include一些任务(tasks),提高代码的可维护性。可以是相对路径或绝对路径

    第27页:文本替换

    `define (了解)编译指导`define提供了一种简单的文本替换的功能`define<macro_name> <macro_text>在编译时<macro_text>替换<macro_name>。可提高描述的可读性。`definenot_delay#1`define and_delay #2`define or_delay #1module MUX2_1 (out, a, b, sel);output out;input a, b, sel;wire sel_, a1, b1;not `not_delaynot1( sel_, sel);and ` and_delay and1( a1, a, sel_);and ` and_delay and2( b1, b, sel);or ` or_delay or1( out, a1, b1);endmodule定义not_delay使用not_delay

    第28页:文本替换(了解) 解除定义

    文本替换(了解)

    • 解除定义的宏,使用`undef macro_name
    • 使用编译指导`define,可以
    • 提高描述的可读性
    • 定义全局设计参数,如延时和矢量的位数。这些参数可以定义在同一位置。这样,当要修改设计配置时,只需要在一个地方修改。
    • 定义Verilog命令的简写形式`define vectors_ file "/usr1/chrisz/library/vectors"`define results_ file "/ usr1/chrisz/library/results"
    • 可以将`define放在一个文件中,与其它文件一起编译。

    第29页:Verilog HDL数据类型

    3.3.1
    线网类型
    3.3.2
    寄存器类型
    3.3.3
    参数
    3.3.4
    位选择
    3.3.5
    总结

    第30页:Verilog HDL数据类型(续1)

    Verilog HDL数据类型Verilog HDL有两大类数据类型。1.线网类型(net type):表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。2.寄存器类型(register type):表示一个抽象的数据存储单元,它只能在always语句和initial语句等过程语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。

    第31页:线网类型

    net(线网)型net需要被持续的驱动,驱动它的可以是门和模块。当net驱动器的值发生变化时,新值被传送到net上。在下例中,线网out由or门驱动。当or门的输入信号置位时将传输到线网net上。

    第32页:net类的类型(线网)

    net类的类型(线网)

    • 有多种net类型用于设计(design-specific)建模和工艺(technology-specific)建模
    • 没有声明的net的缺省类型为1位(标量)wire类型。但这个缺省类型可由下面的编译指导改变:`default_nettype <nettype>功能net类型标准内部连接线(缺省)电源和地多驱动源线或多驱动源线与能保存电荷的net无驱动时上拉/下拉wire, trisupply1, supply0wor,triorwand,triandtriregtri1, tri0综合编译器不支持的net类型

    第33页:线网数据类型可综合的线网数据类型包含下述

    wireWor wand trisupply0 supply1最常用的是wire!!

    第34页:简单的线网类型说明语法

    为:net_kind[msb:lsb]net1,. . ,netN;解释:1. net_kind是上述线网类型的一种;2. msb和lsb是用于定义线网范围的常量表达式,如果没有定义,缺省为1位。例1:wirerst, data;

    第35页:out 连续赋值示例

    线网型变量使用举例module mux2to1 (out, a, b, sel); input a, b, sel; output out; wire out; assign out=(sel)?b:a; 

    第36页:寄存器类型

    寄存器的类型

    • 寄存器类有四种数据类型寄存器类型功能reg是最常用的寄存器类型,无符号型。integer32位有符号整数变量,算术操作产生二进制补码形式。的结果。通常用作不会由硬件实现的的数据处理。real双精度的带符号浮点变量,用法与integer相同。time 64位无符号整数变量,用于仿真时间的保存与处理。realtime与real内容一致,但可以用作实数仿真时间的保存与处理。

    第37页:寄存器类型reg-使用语法reg是寄存器

    数据类型最常见的数据类型。使用语法形式如下:reg [msb: lsb] reg1,. . . ,regN;msb和lsb定义了范围,并且均为常数值表达式;如果没有定义范围,缺省值为1位寄存器。例1:reg [3:0] counter1;//4位寄存器。例2:reg counter2;// 1位寄存器。例3:reg [31:0] data_buffer1 ;reg [32:1] data_buffer2 ;

    第38页:常见的寄存器类型

    Integerinteger A, B, C ;

    第39页:sel 时序逻辑示例

    寄存器型变量使用举例module mux2to1 (out, a, b, sel); input a, b, sel; output out; reg out; always @( sel or a or b)if (! sel) out = a; else out = b; 

    第40页:module top 代码示例

    如何给模块端口信号选择正确的数据类型?moduletop(A,B,Y ); input A,B; output Y; reg A1,B1;//reg?//对于信号Y,A,B呢?DUT u1 (Y1, A1, B1); DUT u2 (Y, A, B); endmodulemoduleDUT (O, in1, in2); output O; input in1, in2; wire in1, in2; reg O;always @(in1 or in2)O=in1+in2; endmodule输入端口(如右图in1、in2信号)只能是net;但输入端口可以由net/register驱动输出端口(如O )可以是net/register类型,但输出端口只能驱动net若in1、in2说明为reg则会产生错误。in1in2OABY或者:wire O;assign O=in1+in2;

    第41页:module example 代码示例

    练习-选择数据类型时常犯的错误修改前:module example(o1, o2, a, b,c,d); input a, b,c,d; output o1, o2; reg c, d; reg o2; andu1(o2, c, d); always @(a or b)if (a) o1 = b; else o1 = 0; endmodule修改后:module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2;// reg o2reg o1; andu1(o2, c, d); always @(a or b)if (a) o1 = b; else o1 = 0; endmoduleexample.v或者换成:always @(c or d)o2=c&d; 或者换成:assigno2=c&d;

    第42页:参数

    参数是一个常量。

    • 参数定义的语法:parameter <list_of_assignment>
    • 如:parameter WIDTH= 8'h20
    • parameter BYTE=4'h8

    第43页:参数(parameters)-使用举例

    modulemod1( out, in1, in2);. . .. . .parameterWORD_WIDTH= 8;. . .. . .wire [WORD_WIDTH-1: 0] in1;// A wire declaration using parameter. . .. . .endmodule

    • 例:

    第44页:参数(parameters)使用注意事项

    参数(parameters)使用注意事项

    • 1.推荐:一般定义参数等常量名称用大写,变量名称用小写!
    • 2.可一次定义多个参数,用逗号隔开。如:parameterWORD_WIDTH= 32,ADDR_WIDTH= 8;等同于:parameterWORD_WIDTH= 32;parameterADDR_WIDTH= 8;

    第45页:parameters)使用注意事项

    (parameters)使用注意事项(cont.)

    • 3.参数的定义是局部的,只在当前模块中有效。如:在工程Multi-CPU中一个文件a.v中定义parameterWORD_WIDTH=32
    • 在同一工程另一个文件b.v中定义parameterWORD_WIDTH = 8
    • 是可以的。//但是如果这样,项目比较复杂时,容易混淆WORD_WIDTH的值,不建议这样使用,可以声明成两个不同名称的参数来处理这种情况。

    第46页:参数(parameters)使(续1)

    参数(parameters)使用注意事项(cont.)

    • !!!!注意与`define的异同如在文件sram_control.v中,定义有:`define ADDR_WIDTH 12`defineDATA_WIDTH 32moduleexample2( clk,rst,addr_in,data_in,data_out)
    • input [`DATA_WIDTH-1: 0] data_in
    • input [`ADDR_WIDTH-1: 0] addr_in
    • output [`DATA_WIDTH-1: 0] data_out
    • wire [`DATA_WIDTH-1: 0] data_in
    • wire [`ADDR_WIDTH-1: 0] addr_in
    • reg [`DATA_WIDTH-1: 0] data_out
    • parameterMEMORY_DEPTH = 1024
    • . . .endmodule

    第47页:或在文件cpu_param.v中定义

    • `define ADDR_WIDTH 12`defineDATA_WIDTH 32然后在文件sram_control.v中如下使用:`include cpu_param.vmoduleexample2( clk,rst,addr_in,data_in,data_out)
    • input [`DATA_WIDTH-1: 0] data_in
    • input [`ADDR_WIDTH-1: 0] addr_in
    • output [`DATA_WIDTH-1: 0] data_out
    • wire [`DATA_WIDTH-1: 0] data_in
    • wire [`ADDR_WIDTH-1: 0] addr_in
    • reg [`DATA_WIDTH-1: 0] data_out
    • parameterMEMORY_DEPTH = 1024
    • . . .endmodule

    第48页:位选择

    位选择从向量中抽取特定的位。reg [31:0] Breg;wire [31:0] Bwire;. . .Breg=~Bwire;或者. . .Breg[31:16]= ~Bwire[15:0];Breg[15:0]= ~Bwire[31:16];

    第49页:整数不能作为位向量访问

    。例如定义了:integer B;对于上面的整数B的说明,B[6]和B[20:10]是非法的。解决办法:一种截取位值的方法是将整数赋值给一般的reg类型变量,然后从中选取相应的位,如:integer Bint;reg [31:0] Breg;/ /由于Bint[6]和Bint[20:10]是不允许的。Breg = Bint;

    第50页:总结

    Verilog模块中常见信号类型-总结

    • 两种主要的信号类型:-寄存器类型:代表reg在always等过程块中被赋值的信号,往往代表触发器,但不一定是触发器。(时序逻辑电路中常常被综合为D触发器
    • 纯组合逻辑电路中被综合为连线)-连线类型:代表wire用assign关键词指定连续/持续赋值所描述的组合逻辑的信号或连线。

    第51页:module rw1 代码示例

    Verilog中reg与wire的不同点

    • 用寄存器(reg)类型变量生成组合逻辑举例:modulerw1( a, b, out1, out2 )
    • input a, b
    • output out1, out2
    • reg out1
    • wire out2
    • assign out2 = a
    • always @(b) out1 = ~b
    • endmoduleaout2BUFFbINVout1

    第52页:module rw2 代码示例

    Verilog中reg与wire的不同点

    • 用寄存器(reg)类型变量生成触发器的例子:module rw2( clk, d, out1, out2 )
    • input clk, d
    • output out1, out2
    • reg out1
    • wire out2
    • assign out2 =d & ~out1
    • always @(posedge clk)out1 <= d
    • endmoduledout2AND2i1clkDQout1

    第53页:Verilog HDL运算符

    Verilog HDL运算符

    • 知识点:
    • 3.4.1算术操作符
    • 3.4.2逻辑运算符
    • 3.4.3按位操作符
    • 3.4.4关系运算符
    • 3.4.5相等操作符
    • 3.4.6条件操作符
    • 3.4.7移位操作符
    • 3.4.8连接操作
    • 3.4.9复制操作

    第54页:算术操作符

    modulearithops_test; parameter FIVE = 5; integer ans, int; reg [3: 0] rega, regb; reg [3: 0] num; initial beginrega = 3; regb = 4'b1010; int =-3;// ans =-15#20 ans = (int + 5)/ 2;// ans =-1#50 num = rega + 1;// num = 1101#70 num = regb % rega;endendmodule+加-减*乘/除%模•将负数赋值给reg或其它无符号变量,使用2的补码算术。•如果操作数的某一位是x或z,则结果为x•在整数除法中,余数舍弃•模运算中使用第一个操作数的符号注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。;

    第55页:逻辑运算符

    逻辑操作符有
    && (逻辑与)|| (逻辑或)!(逻辑非)这些操作符在逻辑值0或1上操作。逻辑操作的结构为0或1。

    第56页:逻辑运算符例一例如,假定:Crd =

    逻辑运算符例一例如,假定
    Crd = 1'b0;

    第57页:逻辑运算符例二对于向量操作

    非0向量作为1处理。例如,假定:A=4'b0110;B=4'b0100;那么:A||B结果为?A&&B结果为?并且:!A与!B的结果相同,为?。

    第58页:按位操作符

    按位操作符有
    ~(一元非)&(二元与)|(二元或)^(二元异或)~^, ^~(二元异或非)

    第59页:按位操作符例一例如,假定

    A=4'b0110;B=4'b0100;那么:A|B结果为?,A||B结果为?A&B结果为?,A&&B结果为?~A=? ,!A=?

    第60页:关系运算符

    关系操作符有
    >(大于)<(小于)>=(不小于)<=(不大于)关系操作符的结果为真(1'b1)或假(1'b0)或1'bx。

    第61页:相等操作符

    (掌握)逻辑等逻辑不等==!=module equalities_test; reg [3: 0] rega, regb, regc; reg val; initial beginrega = 4'b0011; regb = 4'b1010; regc = 4'b1x10; #10 val = (rega == regb);// val = 1#30 val =(regb != regc);endendmodule•其结果是1’b1、1’b0或1’bx。•如果左边及右边为确定值,并且相等,则结果为1。•如果左边及右边为确定值,并且不相等,则结果为0。•如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。•!=的结果与= =相反值确定是指所有的位为0或1。不确定值是有值为x或z的位。==!=;

    第62页:Verilog代码示例

    相等操作符(了解)相同(case等)不相同(case不等)===!==module equalities2_test; reg [3: 0] rega, regb, regc; reg val; initial beginrega = 4'b0011; regb = 4'b1010; regc = 4'b1x10; #10 val = (rega === regb);// val = 1#30 val =(regb === regc);endendmodule•其结果是1’b1、1’b0或1’bx。•如果左边及右边的值相同(包括x、z),则结果为1。•如果左边及右边的值不相同,则结果为0。•!==的结果与===相反※※※综合工具不支持!!!!!,也就是说没有相应的电路来对应这种操作符。===!==;

    第63页:条件操作符

    条件操作符的语法为
    <LHS> = <condition>?<true_expression>:<false_expression>;其意思是:if condition is TRUE, then LHS=true_expression,else LHS = false_expression每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。例如:assign out = (sel == 0) ? a : b;若sel为0则out =a;若sel为1则out = b;如果sel为x或z,则结果可能为x或z。

    第64页:out 连续赋值示例(续1)

    条件操作符-使用实例module likebufif( in, en, out); input in; input en; output out; assign out = (en == 1) ? in : 'bz; endmodulemodule like4to1( a, b, c, d, sel, out); input a, b, c, d; input [1: 0] sel; output out; assign out = sel == 2'b00 ? a :sel == 2'b01 ? b :sel == 2'b10 ? c : d; endmodule如果条件值为x或z,则结果可能为x或z;

    第65页:移位操作符

    移位操作符有
    << (左移)>> (右移)如rega << 5意思是rega向左移5位;rega >> 3意思是rega向右移3位;
    • 移位操作符对其左边的操作数进行向左或向右的位移位操作。
    • 第二个操作数(移位位数)是无符号数。

    第66页:module shift_test

    ;reg [9
    0] num, num1;reg [7: 0] rega, regb;…//如果rega = 8'b0000 1100;num <= rega << 5 ;

    第67页:连接操作

    连接操作是将小表达式合并形成大表达式的操作。形式如下:{expr1, expr2, . . .,exprN}

    第68页:连接操作实例

    wire [9:0] d; wire [9:0] a; assign d[9:5] ={a[0], a[1], a[2], a[3], a[4] };//高4位与低4位交换。;

    第69页:由于非定长常数

    的长度未知,不允许连接非定长常数。例如,下列式子非法:reg [16:0] a;reg [31:0] d;…d={a,5};//error!!不允许连接操作非定长常数。d={a,16'h0005};//error!!右边33位,左边32位,位宽不匹配,一样会出错改为:d={a,15'h5};连接操作注意事项

    第70页:复制操作

    复制通过指定重复次数来执行操作。语法形式如下:{repetition_number{expr1,expr2, ...,exprn} }

    第71页:d 连续赋值示例

    例一:wire [7:0] d; wire [11:0] a; …assign d={2{4'b1011}};//a为12'b1111 1011 1011//注意:assign a= {4{d[7]},d};