systemVerilog快速入门PPT.ppt_第1页
systemVerilog快速入门PPT.ppt_第2页
systemVerilog快速入门PPT.ppt_第3页
systemVerilog快速入门PPT.ppt_第4页
systemVerilog快速入门PPT.ppt_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SystemVerilog 讲座,第一讲: SystemVerilog 基本知识,夏宇闻 神州龙芯集成电路设计公司 2008,Verilog HDL的发展历史,1984: Gateway Design Automation 推出 Verilog 初版 1989: Gateway 被Cadence Design Systems 公司收购 1990: Cadence 向业界公开 Verilog HDL 标准 1993: OVI 提升 the Verilog 标准,但没有被普遍接受 1995: IEEE 推出 Verilog HDL (IEEE 1364-1995)标准 2001: IEEE 推出

2、Verilog IEEE Std1364-2001 标准 2002: IEEE 推出 Verilog IEEE Std1364.1-2002 标准 2002: Accellera 对 SystemVerilog 3.0 进行标准化 Accellera 是OVI / 4态,Verilog-2001(位宽可变)数据类型 integer i; /4态,Verilog-2001(32位)有符号数据类型 logic w; /4态,(位宽可变) 0,1,x,或者 z bit b; /2态,(位宽可变) 1位 0 或 1 byte b8; /2态,(8位)有符号整型数 shortint s; /2态,(16

3、位)有符号整型数 int i; /2态,(32位)有符号整型数 longint l; /2态,(64位)有符号整型数 注:* -bit 类型既可以用于变量也可以用于线网。另外还加入了其他一些数据类型,SystemVerilog 新添加的数据类型,reg 15:0 r16; logic 15:0 w16; bit 15:0 b16;,reg, logic和 bit数据类型位宽可以改变,几乎通用的数据类型logic(等价于原来的 reg类型),logic 类型类似于VHDL中的std_ulogic类型 - 对应的具体元件待定 - 只允许使用一个驱动源,或者来自于一个或者多个过程块的过程赋值,对同一

4、变量既进行连续赋值又进行过程赋值是非法的,不允许的。,- 在SystemVerilog中:logic和reg类型是一致的(类似于Verilog中wire和tri类型是一致的),wire数据类型仍旧有用因为: - 多驱动源总线: 如多路总线交换器(bus crossbars ,ifdef STATE2 typedef bit bit_t; /2 state else typedef logic bit_t; /4 state endif,defines.vh,设计策略:用各种typedefs,只要用typedef 就可以很容易地在4态和2态逻辑仿真之间切换以加快仿真速度,verilog_cmd

5、define.vh tb.v dff.v,verilog_cmd define.vh tb.v dff.v +define+STATE2,确省,为4态逻辑值仿真,只用 2态逻辑值,仿真速度快,已确定的和待确定的类型,四态和两态设计策略用待确定类型是最容易的。,功能相当于VHDL中的std_ulogic 类型,很有效率,与VHDL中的std_logic类型没有功能可比较的类型,ifdef STATE2 typedef bit bit_t /2-态 else typedef logic bit_t;/4-态 endif,define.vh,ifdef STATE2 typedef bit bit_

6、t /2-态 typedef ? tri_t /2-态 else typedef reg bit_t;/4-态 typedef wire tri_t;/4-态 endif,define.vh,无多驱动器的2态类型,- 也许下一个版本的SystemVerilog能得到修正,没有容易的std_ulogic 和std_logic 之间切换的等价语句,Verilog-2001 数据类型(模块内部),模块的输入必须是线网类型的信号,module A(out,in); output out; input in; reg out; wire in; always (in) out = in; endmodu

7、le,module B(out,in); output out; input in; wire out; wire in; assign out = in; endmodule,用reg类型的输出 (过程赋值语句的LHS必须用变量类型),输出是线网类型的 (用连续赋值驱动的变量类型),Verilog-2001 数据类型(模块外部),信号由源驱动的必须定义为线网类型,module A(out,in); 黑箱 输出 输入,module B(out,in); 黑箱 输出 输入,实例的输入往往由测试模块的变量驱动,a2b,输出信号必须定义为线网类型,module test; reg t_in; wir

8、e a2b; wire t_out; A u1(.out(a2b), .in(t_in); B u2(.out(t_out), .in(a2b); initial t_in =1;,t_out,Verilog-2001 数据类型(模块内部、外部和测试放在一起),线网声明语句,过程赋值语句的LHS必须用变量类型,通常是reg类型,这些都声明为线网类型,module test; reg t_in; wire a2b; wire t_out; A u1(.out(a2b), .in(t_in); B u2(.out(t_out), .in(a2b); initial t_in =1; . endmo

9、dule,a2b,t_out,变量 声明语句,SystemVerilog对端口定义没有限制,SystemVerilog允许过程或者连续赋值给变量赋值,线网声明语句,logic 类型可以替代所有其他类型,包括reg类型,这些都声明为线网类型,module test; logic t_in; logic a2b; logic t_out; A u1(.out(a2b), .in(t_in); B u2(.out(t_out), .in(a2b); initial t_in =1; . endmodule,a2b,t_out,只有一个驱动源的变量都可以声明为logic类型,SystemVerilog

10、表示数字的语法有改进,module fsm_sv1b_3; . always * begin next = x; case (stat側 endmodule,类似VHDL的(Other=) 语句进行“填满”的操作,x 等于Verilog-2001的bx,z 等于Verilog-2001的bz,1 等于赋-1的值(即-1的2进制补码,也就是所有位赋为1),0 等于赋给0的值(也就是所有位赋为0),特定逻辑过程,SystemVerilog 有三个新的特定的逻辑过程来表达设计者的意图:,always_comb always_latch always_ff,always_comb begin tmp1

11、= a end,always_latch if (en) q = d;,always_ff (posedge clk, negedge rst_n) if (!rst_n) q = 0 ; else q = d;,允许仿真工具进行某些 语法功能检查(linting functionality),always_comb特定逻辑过程,always_comb -允许仿真工具检查正确的组合逻辑代码风格,正确的,module ao1( output bit_t y, input bit_t a, b, c, d ); bit_t tmp1, tmp2; always_comb begin tmp1 =

12、a end endmodule,module ao1( output bit_t y, input bit_t en, d ); always_comb if (en) q = 0 ; endmodule,错误: 想生成组合逻辑 但产生了锁存器,可能发生的 错误信息:,always_latch特定逻辑过程,always_latch -允许仿真工具检查正确的锁存器逻辑代码风格,正确的,module lat1( output bit_t q, input bit_t en, d ); always_latch if (en) q = d; endmodule,module lat1( output

13、 bit_t q, input bit_t en, d ); always_latch if (en) q = d; else q = q; endmodule,错误: 组合逻辑反馈环 路不能生成锁存器,可能发生的 错误信息:,always_ff特定逻辑过程,always_ff -允许仿真工具检查正确的寄存器逻辑代码风格,正确的,module dff1( output bit_t q, input bit_t d, clk, rst_n ); always_ff (posedge clk, negedge rst_n) if (!rst_n) q = 0; else q = d ; endmo

14、dule,module dff1 ( output bit_t q, input bit_t d, clk, rst_n ); always_ff (clk, rst_n) if (!rst_n) q = 0; else q = q; endmodule,错误: 非法敏感列表 不能生成触发器,可能发生的 错误信息:,always * 与 always_comb 的差别,它们之间的真正有什么差别,IEEE VSG和Accellera SystemVerilog 委员会还在辩论中,尚未最后确认,module fsm_svlb_3 . always * begin next = x; case (s

15、tate) . end . endmodule,always_comb 对于函数内容的变化是敏感的,存在一些差别,always_comb 可用来检查非法锁存器,always_comb 在0时刻结束时自动触发一次,* 可以写在always 块内,module fsm_svlb_3 . always_comb begin next = x; case (state) . end . endmodule,Void 函数,没有返回值的函数 不必从Verilog 表达式中被调用 -Void 函数可以象Verilog 任务一样,独立地调用 与Verilog 任务不同, Void 函数 - 不能等待 - 不

16、能包括延迟 - 不能包括事件触发 - 被always_comb 搜寻到的信号自动加入敏感列表,always_comb 与 Void 函数,module comb1( output bit_t 2:1 y, input bit_t a, b, c) ; always_comb orf1(a); function void orf1; input a; y1 = a | b | C; endfunction always_comb ort1(a); task ort1; input a; y2 = a | b | C; endtask endmodule,always * orf1(a) ;,等价

17、于: always (a),等价于: always (a,b,c),void 函数的行为 类似于0延迟的任务,等价于: always (a),Verilog 任务,b 和 c 是隐含的输入,always * ort1(a) ;,等价于: always (a),b 和 c 是隐含的输入,-或者-,-或者-,只有always_comb 对函数的内容的变化是敏感的,always_ff 用于双数据率(DDR)时序逻辑?,有可能提高未来综合工具的性能?,无正跳变沿触发时钟信号(clk) 无负跳变沿触发时钟信号(clk),目前对综合器来说 该语法是非法的,module ddrff ( output bit

18、_t q, input bit_t d, clk, rst_n ); always_ff (clk, negedge rst_n) if (! rst_n) q = 0; else q = d; endmodule,去掉正跳变沿是否可以 允许用正负两个沿触发?,always_ff 显示 设计者的意图,这能综合成ASIC厂商库中的双数据率(DDR)时序逻辑吗?,设计意图unique/priority,有优先的还是没有优先的? 来回考虑 综合时常容易产生的错误!,full_case parallel_case,看似“完全一样”的语句 对应的实体是不同 的,这些指令告诉综合编译器,编 写的设计代码有

19、些地方和仿真 器理解的有些不同,综合前与综合后 的仿真可能存在 一些差别,unique 和 priority 这两个新添的指令告诉仿真器和综合器同一个信息,unique case priority case unique if priority if,使得仿真器、综合器和 形式化验证工具的行为 变得一致,设计意图 priority,priority case: - full_case,full_case的 仿真和综合,所有的可能都已经定义了, 任何其他的可能都是错误的,priority case (1b1) irq0: irq= 4b1 0; irq1: irq= 4b1 1; irq2: i

20、rq= 4b1 2; irq3: irq= 4b1 3; endcase,priority if: - 所有的分支被指定后不需要最后结束的else,priority if (irq0) irq = 4b1; else if (irq1) irq = 4b2; else if (irq2) irq = 4b4; else if (irq3) irq = 4b8;,priority case (1b1) irq0: irq= 4b1 0; irq1: irq= 4b1 1; irq2: irq= 4b1 2; irq3: irq= 4b1 3; default: irq = 0; endcase,

21、priority if (irq0) irq = 4b1; else if (irq1) irq = 4b2; else if (irq2) irq = 4b4; else if (irq3) irq = 4b8; else irq = 4b0;,irq0到irq3中至少有一个必定为高否则仿真就出现运行错误,default 或 最后的else语句 使得 priority关键字无效,设计意图 Unique,unique case: - full_case / parallel_case,full_case 和parallel_case 的仿真和综合,所有的可能都已经定义了, 任何其他的可能都是错

22、误的,unique case (1b1) sel0: muxo = a; sel1: muxo = b; sel2: muxo = c; endcase,unique if: - full_case/ parallel_case,unique if (sel0) muxo = a; else if (sel1) muxo = b; else if (sel2) muxo = c;,if sel = = 3 b011 仿真出现运行错误,任何没有预料到的sel值 将使仿真出现运行错误,unique case (1b1) sel0: muxo = a; sel1: muxo = b; sel2: m

23、uxo = c; default: muxo = x; endcase,unique if (sel0) muxo = a; else if (sel1) muxo = b; else if (sel2) muxo = c; else muxo = x;,对没有预料到的sel值不会出现仿真运行错误,unique仍旧测试 覆盖的条件,Moore FSM举例 - - 状态图,FSM状态图,两个always块的编码风格(符号、参数赋值时序always块),module sm2a (rd,ds,go,ws,clk,rstN); output rd, ds; input go, ws, clk, rst

24、N; parameter IDLE = 2b00, READ = 2b01, DLY = 2b10, DONE = 2b11; reg 1:0 state, next; always (posedge clk or negedge rstN) if (!rstN) state =IDLE; else state = next;,Verilog 没有 枚举类型变量,参数被用于 有限状态机的设计,两个always块的编码风格(组合逻辑always块-连续赋值输出),always (state or go or ws) begin next = 2bx; case(state) IDLE: if (

25、go) next = READ; else next = IDLE; READ: next = DLY; DLY : if (!ws) next = DONE; else next = READ; DONE: next = IDLE; endcase end assign rd = (state = read)|(state=DLY); assign ds = (state = DONE); endmodule,仿真差错诀窍,综合优化诀窍,输出方法1 (连续赋值),两个always块的编码风格(组合逻辑always块-always阻塞赋值输出), always (state or go or

26、ws) begin next = 2bx; rd = 1b0; ds = 1 b0; case(state) IDLE: if (go) next = READ; else next = IDLE; READ: begin rd = 1b1; next = DLY; end DLY : begin rd = 1b1; if (!ws) next = DONE; else next = READ; end DONE: begin ds = 1b1; next = IDLE; end endcase end endmodule,初始化确省值的赋值 初始化输出值到确省态,输出方法2 (always

27、块赋值),枚举(enumerated)数据类型(更高抽象层面的功能强大的数据类型),typedef enumred, yellow,green,blue,white,black clolors_t; clolors_t light1, light2; initial begin light1 = red; if (light1 = red) light1 = green; end,匿名的2态 整 型(int)变量,enum red, yellow,green light1,light2;,enum bronze=3, silver,gold medal;,enum a=0, b=7, c, d

28、 = 8 alphabet;,enum bronze=4h3, silver,gold medal;,silver = 4, gold = 5;,silver = 4h4, gold = 4h5;,语法错误 (隐含)c= 8, (明确)d = 8;,traffic_light = 0 (“red”),traffic_light = 2 (“green”),枚举类型的抽象,module fsm_svla_3; . enum IDLE, READ, DLY, DONE, XX state, next; . endmodule,无指定值的抽象 枚举名(值可以在 以后指定),枚举变量 state 和

29、next,逗号把括在内的 枚举名分隔开来,枚举关键字,枚举-赋整型值,module fsm_svla_3; . enum IDLE = 3b000, READ = 3b001, DLY = 3b010, DONE = 3b011, XX = 3b111 state, next; . endmodule,未指定数据类型, 即假定数据为整型,确省类型,用户对枚举名 赋值,在 FSM 设计用3个always块 应用枚举,module fsm_svla_3; (output reg rd,ds, input go, ws, clk,rst_n ); enum IDLE , READ , DLY , D

30、ONE , XX state, next; always (posedge clk, negedge rst_n) if (!rst_n) state = IDLE; else state = next; always * begin next = xx; case (state) IDLE: if (go) next = READ; else next = IDLE; READ: next = DLY; DLY: if (!ws) next = DONE; else next = READ; DONE: next = IDLE; end .,枚举的测试 和赋值,. always (posed

31、ge clk, negedge rst_n) if (!rst_n) begin rd = 1b0; ds = 1b0; end else begin rd = 1b0; ds = 1b0; case (next) READ: rd = 1b1; DLY: rd = 1b1; DONE: ds = 1b1; endcase end endmodule,逗号分开的敏感列表,*表示组合逻辑的敏感列表 (简化的语法,减少RTL错误),抽象的枚举名,枚举 指定四状态值,module fsm_svlb_3; . enum reg 1:0 IDLE = 2b00, READ = 2b01, DLY = 2

32、b10, DONE = 2b11, XX = x state, next; . endmodule,x 赋值在仿真无关项 优化综合和调试时非 常有用,指定4态数据类 型 允许数据值 为x 或者z,在 FSM 设计用3个always块 应用赋值枚举,module fsm_svla_3; (output reg rd,ds, input go, ws, clk,rst_n ); enum reg 1:0 IDLE=2b00 , READ=2b01 , DLY=2b10 , DONE =2b11 , XX =x state, next; always (posedge clk, negedge rs

33、t_n) if (!rst_n) state = IDLE; else state = next; always * begin next = xx; case (state) IDLE: if (go) next = READ; else next = IDLE; READ: next = DLY; DLY: if (!ws) next = DONE; else next = READ; DONE: next = IDLE; end .,. always (posedge clk, negedge rst_n) if (!rst_n) begin rd = 1b0; ds = 1b0; en

34、d else begin rd = 1b0; ds = 1b0; case (next) READ: rd = 1b1; DLY: rd = 1b1; DONE: ds = 1b1; endcase end endmodule,从抽象到具体需要做的唯一 修改就是在枚举定义处赋值,赋值的枚举值,在 FSM 设计用3个always块 SystemVerilog 3.0 - 应用赋值枚举,module fsm_svla_3; (output reg rd,ds, input go, ws, clk,rst_n ); enum reg 1:0 IDLE=2b00 , READ=2b01 , DLY=2

35、b10 , DONE =2b11 , XX =x state, next; always_ff (posedge clk, negedge rst_n) if (!rst_n) state = IDLE; else state = next; always_comb begin next = xx; unique case (state) IDLE: if (go) next = READ; else next = IDLE; READ: next = DLY; DLY: if (!ws) next = DONE; else next = READ; DONE: next = IDLE; en

36、d .,. always (posedge clk, negedge rst_n) if (!rst_n) begin rd = 1b0; ds = 1b0; end else begin rd = 1b0; ds = 1b0; case (next) READ: rd = 1b1; DLY: rd = 1b1; DONE: ds = 1b1; endcase end endmodule,无论对仿真器和综合器以及 形式化验证工具 都相当于 full_case parallel_case,允许更多的类似lint 的代码检查,在 FSM 设计用3个always块 SystemVerilog 3.0

37、 - 应用赋值枚举,enum reg 1:0 IDLE=2b00, READ=2b01, DLY=2b10, DONE =2b11 , XX =x state, next;,加入四状态变量的枚举类 型,允许合法状态赋值和 x状态赋值,以未定义的抽象 状态开始,enum IDLE, READ, DLY, DONE, XX state, next;,有利于抽象,有利于观察波形,有利于调试和 综合,枚举类型 波形显示,enum reg 1:0 IDLE=2b00, READ=2b01, DLY=2b10, DONE =2b11 , XX =x state, next;,确切标准的波形显示 能力正在定

38、义中,循环语句的性能得到增强,module for4a( output reg 31:0 y, input 31:0 a, input s); integer i; always (a or s) for ( i=0; i32; i=i+1) if (!s) yi = ai; else yi = a 31-i; endmodule,module for4b( output logic 31:0 y, input 31:0 a, input s); always (a or s) for ( int i=0; i32; i+) if (!s) yi = ai; else yi = a 31-i;

39、 endmodule,独立的迭代 变量声明,本地迭代 变量声明,自动递加,本地迭代变量是 自动变量退出循 环后就不再存在,Verilog-2001,SystemVerilog,显式的递加,a31:0,a0:31,a31:0,i1,i0,s,y,y31:0,s,SystemVerilog 还增加了一个 do-while循环(底测试循环),隐含的端口连接,Verilog 和VHDL都能用按端口名连接或按顺序连接的方式引用实例模块 SystemVerilog用了两个新的隐含端口连接解决了顶层代码编写时表示端口连接代码的冗长 - .name 端口连接 - .* 隐含的端口连接,大型ASIC顶层模块的端

40、口连接非常麻烦而且冗长,下面是一个中等大小模块的例子,中央算术逻辑单元(CALU)方块图,注意:所有寄存 器的时钟端都由 “clk”驱动,异步 复位都由“rst_n” 驱动,MultOp1 reg,shifter(0,1,4),MultOut reg,Accumulator,Barrel shifter (0-16),MUX,ALU (32bit),Multiplier,16 data,16,32,16,16,16,16,16,32,32,32,32,32,32,alu_out,acc,multout,bs,acc,alu_in,en_acc,alu_op2:0,muxsel,ld_multo

41、p1,ld_multout,ld_acc,ld_shft,en_shft,shft_lshft,bs_lshft4:0,ld_bs,mop1,mult,32,中央算术逻辑单元(CALU)模块之一,module calu3( inout 15:0 data; input 4:0 bs_lshft; input 2:0 alu_op; input 1:0 shft_lshft; input calu_muxsel, en_shft, ld_acc, ld_bs; input clk,rst_n); wire 31:0 acc, alu_in, alu_out, bs, mult, multout;

42、 wire 15:0 mop1; multop1 multop1 (.mop1, .data, .ld_multop1, .clk, . rst_n); multiplier multiplier(.mult, .mop1, .data); multoutreg multoutreg (.multout, .mult, .ld_multout, .clk, .rst_n);,MultOp1 reg,MultOut reg,Multiplier,multop1 multop1 (.mop1, .data, .ld_multop1, .clk, . rst_n);,端口名的匹配只 需要列出一次,中

43、央算术逻辑单元(CALU)模块之二, barrel_shifter barrel_shifter( .bs, .data, .bs_lshft, .ld_bs, .clk, . rst_n); mult2 mux ( .y(alu_in), .i1(acc), .sel1(calu_muxsel); alu alu (.aluout, .zero( ), .neg( ), .alu_in, .acc, .alu_op); accumulator accumulator (.acc, .alu_out, .ld_acc, .clk, .rst_n); shifter shifter(.data,

44、 .acc, .shft_lshft,. ld_shft, .en_shft, .clk, . rst_n); tribuf tribuf (.data, .acc(acc15:0), en_acc); endmodule,具备所有按端口 名连接的优点,Barrel shifter (0-16),MUX,ALU (32bit),Accumulator,shifter(0,1,4),代码更简练!,中央算术逻辑单元(CALU)顶层模块 用 * 表示隐含的端口,module calu4( inout 15:0 data, input 4:0 bs_lshft, input 2:0 alu_op, i

45、nput 1:0 shft_lshft, input calu_muxsel, en_shft, ld_acc, ld_bs, input ld_multop1, ld_multout, ls_shft, en_acc, input clk, rst_n) ; wire 31:0 acc, alu_in, alu_out, bs, mult, multout; wire 15:0 mop1; multop1 multtop1 ( .* ); multiplier multiplier ( .* ); multoutreg multoutreg ( .* ); barrel_shifter ba

46、rrel_shifter ( .* ); mult2 mux ( .y(alu_in), .i0(multout), i1(acc), sell(calu_muxsel ); alu alu ( .*, .zero( ), .neg( ); accumulator accumulator ( .* ); shifter shifter( .* ); tribuf tribuf (.*, .acc(acc15:0 ); endmodule,本风格重点表达端 口出现不同的地方,Barrel shifter (0-16),MUX,ALU (32bit),Accumulator,shifter(0,1

47、,4),代码更简练,MultOut reg,MultOp1 reg,隐含 .name 和 . * 端口连接的规则,在同一个实例引用中禁止混用 .* 和 .name端口; 允许在同一个实例引用中使用 .name和 .name(signal)连接; 也允许在同一个实例引用中使用 .* 和 .name(signal)的连接; 必须用 .name(signal) 连接的情况: - 位宽不匹配 - 名称不匹配 - 没有连接的端口,inst u1(, .data(data7:0),.);,inst u2(, .data(pdata), .);,inst u3(, .berr( ), .);,注意:比Ver

48、ilog2001有更强大的端口连接描述,表述更简洁,CALU顶层模四种不同端口连接代码长度不同,隐含端口连接的缺点,module drivera ( output 7:0 y, input 7:0 a, input ena); assign y = ena? a : 8bz; endmodule,如果端口标识符相同很容易造成连接错误 - 出错后很难发现,module driverc ( output 7:0 y, input 7:0 c, input ena); assign y = ena ? c : 8bz; endmodule,module driverd ( output 7:0 y,

49、 input 7:0 c, input ena); assign y = ena? d : 8bz; endmodule,module driverb ( output 7:0 y, input 7:0 b, input ena); assign y = ena? b : 8bz; endmodule,使能信号名 ena都相同,想设计的 逻辑,端口连接时用别名,module drivera ( output 7:0 y1, input 7:0 a, input ena);,module driverc ( output 7:0 y3, input 7:0 c, input ena);,modu

50、le driverd ( output 7:0 y4, input 7:0 c, input ena);,module driverb ( output 7:0 y2, input 7:0 b, input ena);,新的SystemVerilog 关键字alias,module ena_decode ( output reg ena, enb,enc, ene, input 1:0 sel);.,module onehot_busmux ( output 7:0 y, input 7:0 a,b,c,d, input 1:0 sel); wire ena,enb,enc,ene; wire

51、 7:0 y1,y2,y3,y4; alias y=y1=y2=y3=y4; ena_decode u0(.*); drivera u1(.*); drivera u2(.*, .ena(enb); drivera u3(.*, . ena(enc); drivera u4(.*, .ena(ene); endmodule,y,y1,y2, y3,y4都 是别名连 接在一起,用.* 缩短了 实例端口的 连接,用 .* 隐含端口连接的优缺点,优点: 编写顶层模块时容易多了 扫描多达1000个端口的顶层设计更加容易 比按照名字或者顺序连接端口的代码简洁多了。 仍旧保留显式端口连接的优点 编写用模块

52、组装的顶层测试模块变得容易多了 -使测试模块的信号与端口名一致,缺点: 可能造成不想要的连接 - 很难发现错误 - 使模块的分别编译变得 复杂 - 用户使用错误时工具会 发生崩溃 对低层结构性的网表没有什么用处 -原语端口很少能与线网匹配,合法的工具开发者很害怕这一点,.*的端口连接把所有没有必要的麻烦都清除了,只列出端口连接的例外情况即可,所有端口都是隐含连接的,第二讲:,SystemVerilog 提高了设计和验证的效率,设计和验证只需用同一种语言大大提高工作效率,容易学习 - SystemVerilog 语言本身很容易掌握 改善了设计小组和验证小组之间的联络 由于具备高级语言结构,因而减

53、少了设计和验证工作的复杂性,打包的和未打包的数组,未打包的位数组,打包的位数组,1K16位未打包 的存储器,1K16位打包的 存储器,bit a 3:0;,bit 3:0 p ;,bit 15:0 memory 1023:0; initial begin memory i = memoryi; memory i 15:8 = 0; end,bit 1023:0 15:0 vframe; always (vcmd ) if (vcmd =INV) vfram = vframe;,打包的索引可以分块,可以对整个存储 器进行操作,未打包的四维数组,对应这个语句最大的 可访问单元为1位,logic x

54、data 3:0 2:0 1:0 7:0,7:0,2:0,1:0,3:0,打包的一维数组和未打包的三维数组,对应这个语句最大的 可访问单元为8位,logic 7:0 xdata 3:0 2:0 1:0,7:0,2:0,1:0,3:0,打包的二维数组和未打包的二维数组,对应这个语句最大的 可访问单元为16位,logic 1:0 7:0 xdata 3:0 2:0,7:0,2:0,1:0,3:0,打包的四维数组,对应这个语句最大的 可访问单元为192位,logic 3:0 2:01:0 7:0 xdata,7:0,2:0,1:0,3:0,数据的组织,reg 47:0 pktsrc_adr; reg

55、 47:0 pktdst_adr; reg 7:0 InstOpCde; reg 7:0 InstOpRF127:0;,信号成组后有意义 - 指令: 操作符和操作数 - 包的区域:地址、数据和纠错码 Verilog只提供非正式分组,define opcode 31:16 reg 31:0 Instruction; Instruction opcode,用名称,用矢量位置,数据的组织,目标:把数据组织得与高级编程语言一样 - 使其他人能非常清晰地理解设计中数据之间的关系; SystemVerilog 增加了结构,联合和数组类型 - 能够分别使用这些类型,或者结合起来使用从而能更精确地描述设计的意

56、图。,数据的组织,结构(Structs)保留了逻辑分组 引用结构成员需要用比较长的表达式但代码的意义很容易理解,struct addr_t src_adr; addr_t dst_adr; data_t data; pkt; initial begin pkt.src_adr = src_adr; if(pkt.src_adr = = node.adr); . end,把src_adr值 赋给pkt 结构中的src_adr区,把node结构中的adr区与 pkt结构中的dst_adr区做比较,数据的组织打包的结构和打包的联合,未打包的结构(Struct) - 保留了逻辑分组 打包的结构(Struct) - 保留了逻辑分组 - 方便了访问,typedef logic

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论