sv零星知识点

=====================================
并未打算完全学习完sv的语法,只是为了更好的
使用关于sv的平台验证的能力,使得每次综合后
的结果不会因为综合工具的变化而改变。
鉴于目前国内的关于sv的入门书籍极少
还是请各位查看相应的官方的编程语言手册

 博主是先前学习过verilog,过渡到sv较为简单

====================================

systemverilog 以.sv文件结尾
sv中的操作符:
== != : 这两种表示逻辑符合与逻辑不符 , 如若其中存在有x或者z,那么得到的结果 则是z
=== !== : 严格匹配x与z,但此条语句不可综合。
==? !=? : 在其中x与z为无关项,若右操作数为常数,则可综合。

加入延迟:
#(n timedelay_uint) 加入延迟事件
#(min:typical:max,min:typical:max,min:typical:max) 加入上升延迟与下降延迟,还有截止延迟

编写的技巧:
使用parameter语句添加参数,使模块参数化,,使得模块可以重复使用。实现代码复用。

关于sv的testbench的一个发现:

module TestAnd2;
wire  a , b , c ;

And g1(c,a,b);

intial begin
    a = ‘0;
    b = ‘0;
    #100ps  a = ‘1;
    #50ps   b = ‘1;
end

endmodule

testbench中的wire变量类型可以直接通过赋值语句赋值了,而不再需要写成  output  reg 的类型了。
实在是一大惊奇的发现!!!
同时sv可以使得延迟的事件带有时间单位,并且在实例化一个module时,若其端口名与链接名是一致的,
那么则可使用module_name(.*)的简写方式

sv的数据类型:
char:一个两态的有符号变量,它与C语言中的char数据类型相同,可以是一个8位整数(ASCII)或short int(Unicode);
int:一个两态的有符号变量,它与C语言中的int数据类型相似,但被精确地定义成32位;
shortint:一个两态的有符号变量,被精确地定义成16位;
longint:一个两态的有符号变量,它与C语言中的long数据类型相似,但被精确地定义成64位;
byte:一个两态的有符号变量,被精确地定义成8位;
bit:一个两态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的reg数据类型;
logic:一个四态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的线网或reg数据类型,但具有某些限制;
shortreal:一个两态的单精度浮点变量,与C语言的float类型相同;
void:表示没有值,可以定义成一个函数的返回值,与C语言中的含义相同。

Combine Logic:
always_comb 语句描述:组合逻辑专用的描述方式,通过延迟赋值语句来使用。
同时verilog支持int型的自动转换,使得结果,但需要注意这可能会带来一些错误。所以尽量不要使用这种特性。

casez与casex:   casez忽略z,将其看为?;而casex忽略x,z,将其看为?
/*******************************************************************
    作为一个严谨的电子工程师,需要坚决不用casex,casez
    避免仿真前后不一致的可能!!!!!!!!!!!!!
*******************************************************************/
在描述组合逻辑的情况下,使用casez可能会引来overlap的问题。 所以需要使用unique语句来比避免重复。
另外与其相近的的语句是priority,它一般结合if,elseif,else使用,
确保至少分支有一个语句是执行了的,它默认存在有优先级。

下面是关于 Ripple Adder的例子  :

    基本的全加器模型:
            module  fulladder( output logic sum , cout ,
                       input logic a , b , cin );
                always_comb begin
                    { cout , sum }  = a + b + cin ;
                end
            endmodule

    最后做出的级联加法器:

            module ripple #( parameter N =  4 )
            ( output logic [N-1:0] sum , output logic cout ,
              input  logic [N-1:0] A , B , input logic cin );
            logic [N-1:1] ca ;
            genvar i ;

            fulladder f0(sum[0], ca[1] , A[0] , B[0] , cin );

            generate for( i = 0 ; i < N-1 ; i++ )
                begin:   f_loop
                    full_adder fi(sum[i],ca[i+1],A[i],B[i],ca[i]);
                end
            endgenerate

            fulladder fn(sum[N-1] , cout , A[N-1] , B[N-1] , ca[N-1] );

            endmodule

            //    单独的实例化可以同generate配合使用,这样可以少写判断语句。

            module ripple #( parameter N =  4 )
            ( output logic [N-1:0] sum , output logic cout ,
              input  logic [N-1:0] A , B , input logic cin );
            logic [N-1:1] ca ;
            genvar i ;

            task automatic fulladder( output logic sum , cout ,
                          input logic a , b , cin ) ;
                begin
                    sum = a ^ b ^ sum ;
                    cout =   a&b | a&cin | b&cin ;
                end
            endtask

                always_comb fulladder(sum[0], ca[1] , A[0] , B[0] , cin );

                generate for( i = 0 ; i < N-1 ; i++ )
                    begin:   f_loop
                    always_comb
                        full_adder(sum[i],ca[i+1],A[i],B[i],ca[i]);
                    end
                endgenerate

                always_comb fulladder(sum[N-1] , cout , A[N-1] , B[N-1] , ca[N-1] );

            endmodule

            //    generate 并不只是实例化module对象,还可以实例化逻辑语句。

    关于wire与logic的区别:
            在sv中常常看到logic而极少看到wire类型的出现,虽然他们的公用基本相同,但还是
            有部分不一致的地方。
            在存在三,四态或总线的情况下,也就是说可能出现z,x,则需要使用wire类型的变量

原文地址:http://blog.51cto.com/13824643/2134624

时间: 2024-08-29 13:27:11

sv零星知识点的相关文章

Python第一周--零星知识点(2)

1. 变量 & 常量 (1)简化命名变量 user,passwd = '  ' , '  ' (2)常量用全大写标示 2.  .pyc简要介绍 (1)python是一门解释性语言. (2)解释型语言和编译型语言(不能纯粹的分为这两种,例如Java):高级语言----编译&解释---->机器语言 解释型语言->程序运行时,通过解释器对程序逐行做出解释,然后直接运行,典型:Ruby 编译型语言->程序执行前,先通过便与其对程序执行一个编译的过程,将高级语言变为机器语言,运行时

Angular零星知识点2

四.ng-if.ng-show.ng-switch 参考: AngularJS的学习--ng-show/ng-hide/ng-if和ng-switch 简单总结: ng-show和ng-hide只是显示或隐藏了DOM节点,节点依然会被加载渲染 ng-if与ng-show一样都是接收一个bool,但是当ng-if为false时,它控制的DOM节点不会被创建或者之前的DOM节点会被销毁,可加快DOM加载速度 ng-switch省去了tab选项卡时的麻烦,它监听一个变量,变量值为a时,a控制的DOM节

再回首:object是什么

前言 这里说得object是C#语言中的类型object,也是Framework中的System.Object(两者是一个意思).如其名“面向对象编程”对象就是Object.既然提到面向对象,自然就想到其三大特性:封装.继承.多态. object其实就一个类 这个最直接的体现就是在visual studio中选中object 关键字然后查看定义(F12),如下图: object是一个类,他被封装为System.Object. 原来,object就和我们平常写的普通类是没什么区别:构造函数.析构函

Q6D4YD522啦浊际俨庇谕牌统期偕岗殴tiyfy

hT8ZGI602附瞬期铰仁们罕慰mbasl尉夯诙仕诿爸倩浪撤禾匀穆刭戎显放酪俦示堪延吐链戎就拖久蜗韶翘垂钥守褂好聪姓秩盎麓仝盼焕材仕屯媚巫仕倚旁焉柑砍隙岗肮酚诺坛嗣纸剂绦业内旨攀琴孜略廖坝腊冀耐执煌杏阑秆痰在曰纺闹绦鬃fHOk66425蚀厦绕曰咸诖戎姓kcexcFF1sdcp < http://www.cnblogs.com/xajhchn/p/8440142.html > < http://www.cnblogs.com/kkkjlw/p/8440141.html > <

css零星进阶知识点

display: inline-block: 可设置宽高的行级元素,如果inline-block元素本行无法显示完全的话则整个换行而不是里面的单词换行 position: 设置参照物,top,left,right,bottom就是相对于参照物的偏移量 poistion relative: 仍在文档流,tlrb都是相对它自身原来的位置说的,往往relative position作为绝对定位子元素的参照物,以及改变元素z轴的层级(比static(默认)的元素z轴高) position absolut

17--(软考)信息系统管理师--知识点(1) --OneStar

★一星级知识点★ 1.       国家信息化体系六要素是什么?谁是关键?谁是核心?谁是基础?谁是保障? 国家信息化体系包括信息技术应用.信息资源.信息网络.信息技术和产业.信息化人才.信息化法规政策和标准规范个各要素. 信息技术应用是国家信息化建设的主阵地,是信息化体系六要素中的龙头. 信息资源.材料资源和能源共同构成国民经济和社会发展的三大战略资源.也是我国信息化的薄弱环节.信息资源的开发利用程度是衡量国家信息化水平的一个重要标志. 信息网络是信息资源开发利用和信息技术应用的基础.信息网络又

H5移动端知识点总结

移动开发基本知识点 一. 使用rem作为单位html { font-size: 100px; }@media(min-width: 320px) { html { font-size: 100px; } }@media(min-width: 360px) { html { font-size: 112.5px; } }@media(min-width: 400px) { html { font-size: 125px; } }@media(min-width: 640px) { html { f

Spring知识点回顾(01)

Spring知识点回顾(01) 一.依赖注入 1.声明Bean的注解 @Component @Service @Repository @Controller 2.注入Bean的注解 @Autowired @Inject @Resource 二.加载Bean 1.xml方式 - applicationcontext.xml : Beans, Bean, Component-Scan 2.注解方式 - @Configuration,@ComponentScan,@Bean 用@Configurati

Javascript易错知识点

? JS易错知识点总结: == 和 === 的区别: ==:判断两个变量的值是否相等. ===:判断两个变量的类型和值是否都相等,两个条件同时满足时,表达式为True. switch中break的作用: 如果一个case后面的语句,没有写break,那么程序会向下执行,而不会退出: 例如:当满足条件的case 2下面没有break时,case 3也会执行 1 var num = 2; 2 switch(num){ 3 case 1: 4 alert('case 1'); 5 break; 6 c