SystemVerilog语法基础 |
您所在的位置:网站首页 › assign与always › SystemVerilog语法基础 |
电路语句(三):always_comb
前言一、always_comb二、always_comb中的控制语句:caseunique case(独特)priority case(优先级)
三、always_comb中的控制语句:if和foriffor
前言
视频语法学习:B站链接 笔记原地址:https://github.com/Tan-YiFan/DigitalLogic-Autumn2020/tree/syntax/syntax网络不好,可能打不开。 一、always_combalways_comb用于描述复杂电路,comb是combination组合的意思。该模块中输出是等号的左边,输入是等号的右边。 always_comb begin//串行语言描述 a = 1'b1; b = a; a = 1'b0; c = a; endalways_comb内部每条语句都是赋值语句。不能出现电路语句。 always_comb内部描述电路行为。 always_comb有以下性质: 内部覆盖性(如:上例中,a赋值了两遍) 对外原子性(begin…end的内部会影响外面的assign a = b) assign a = b; always_comb begin b = 1'b1; c = a; // 区别于c = b,c = b此处c=1 b = 1'b0; end //对外的结果b=0,a=0,c=0阻塞赋值 always_comb内部允许if,case等控制语句。 二、always_comb中的控制语句:casecase语句常用于描述选择器和译码器。case类似于c的switch语句 unique case(独特) always_comb begin b = 1'b0; unique case (a[3:0]) 4'd1: begin b = 1'b1; end 4'd0: begin b = 1'b0; end default: begin b = 1'b0; // b = b;//形成锁存器,该语句不正确 end endcase end如果没列举所有情况且没有default,如何? 答:缺少可选择的项,等待,可能形成锁存器 priority case(优先级)语义上,可以理解为if…else语句 //把常量当case的枚举项,可能出现多项匹配,a[3]和a[2]都可能=1,但是a[3]比a[2]优先级高 always_comb begin priority case (1'b1) a[3]: begin end a[2]: begin end default: begin end endcase end等同于下面的代码 always_comb begin if(a[3]) begin end else if(a[2]) begin end else if() begin end //... end 三、always_comb中的控制语句:if和forif和for是always_comb中的常用语法。 ifif和else用于条件判断。 always_comb begin b = 1'b0; if (a[3]) begin b = 1'b1; end else if (a[2]) begin b = 1'b0; end end或者下面书写方法 always_comb begin if (a[3]) begin b = 1'b1; end else if (a[2]) begin b = 1'b0; end else begin b = 1'b0; end end forfor在always_comb中,会被解释为循环展开。 for相关的语句:break,continue logic [15:0]a; logic [3:0] b; //interger i;//此处是全局变量 always_comb begin b = '0; for (int i = 15; i >= 0; i--) begin//把i放在内部声明,是局部变量 if (a[i]) begin b = i[3:0]; break; end end end循环变量的上下界都应为常数。 always_comb begin for (int i = 0 ; i = n) break; end endfor和if即可表示行为,也可生成电路。 always_comb begin for (int i = 0; i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |