SystemVerilog硬件设计及建模–第34章.ppt

SystemVerilog硬件设计及建模–第34章.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SystemVerilog硬件设计及建模–第34章

如果是两态变量,无法通过赋X值检测RTL模型中的设计错误 1. 变量没有内置的决断函数,当多个器件驱动同一输出时,无法得到最终值 2. 单驱动逻辑使用变量,多驱动逻辑使用线网 3. 通过连续赋值或模块输出给自动变量赋值也是非法的!!! C语言中的说明: unsigned int u1; int unsigned u2; 上述两种说明都合法! 显式声明为自动变量的例子,函数执行完后再次运行时,count,temp值重新初始化 Error_count声明为静态变量,它的值在两次任务调用间会保持,因此可以记录运行期间总的错误数 对于静态变量,内嵌初始值将在仿真开始前进行一次赋值,对任务或函数的再次调用不会重新初始化变量 对于自动变量,任务或函数每次调用都会对内嵌初始值赋值 SystemVerilog内嵌初始化先于在仿真时刻0执行的事件,保证了过程块读取具有内嵌初始值的变量得到正确值 测试平台应将变量初始化为无效状态 3.10 常数 SystemVerilog加入了一个类似C语言风格的const声明,可以将任何变量声明为常数,有确立完成之后才被赋值,并且可以在自动任务或函数、begin…end、fork…join中声明 const logic [23 : 0] c1 = 7; const int c2 = 15; const real c3 = 3.14; const c4 = 5; //error, 无数据类型 task automatic C; const int N = 5; … endtask SystemVerilog允许用户定义新的变量和线网类型,从而能够在更高的抽象线上进行复杂的设计,使用用户自定义数据类型,可以用更少的代码完成更多的设计功能,并且代码的自文档性和可读性更好。 使用typedef建立用户自定义类型 使用enum建立枚举类型 枚举值的使用 第4章 用户自定义和枚举数据类型 4.1 用户自定义类型 Verilog没有提供用户自行扩展语言变量和线网类型机制,其数据类型主要用于RTL和门级建模,SystemVerilog除增加了许多新数据类型外,还可以用typedef关键字来建立用户自定义类型,新类型定义后,可以声明这个类型的变量,如: typedef int unsigned uint; … uint a, b; //uint类型的两个变量 4.1.1 局部typedef声明 用户自定义类型可以在局部定义,也可以在编译单元域进行外部定义。当一个用户自定义类型只用于设计的特定部分时,typedef的定义可以在模块或设计的接口部分。 module alu(…); typedef logic [3 : 0] nibble; nibble opA, opB; nibble [7 : 0] data; //由8个nibble类型组成的32位向量 … endmodule nibble只有alu模块中可见,其它模块完全可以用nibble表示其它的意思 4.1.2 共享typedef定义 如果一个用户自定义类型会在很多不同的模块或接口是使用,可以把typedef声明放在package或$unit中声明。 package chip_types; `ifdef TWO_STATE typedef bit dtype_t; `else typedef logic dtype_t; `endif endpackage 4.1.2 共享typedef定义 module counter(output chip_types :: dtype_t [15 : 0] count, input chip_types :: clock, resetN); always @(posedge clock, negedge resetN) if (! resetN) count = 0; else count = count + 1; endmodule inport chip_types :: *; module counter(output dtype_t [15 : 0] count, input clock, resetN); always @(posedge clock, negedge resetN) if (! resetN) count = 0; else count =

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档