systemVerilog快速基础学习.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《systemVerilog快速基础学习.ppt》由会员分享,可在线阅读,更多相关《systemVerilog快速基础学习.ppt(124页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- systemverilog 快速 基础 学习
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内