SystemVerilog语法基础——5电路语句(三):always_comb

前言

视频语法学习:B站链接
笔记原地址:https://github.com/Tan-YiFan/DigitalLogic-Autumn2020/tree/syntax/syntax网络不好,可能打不开。

一、always_comb

always_comb用于描述复杂电路,comb是combination组合的意思。该模块中输出是等号的左边,输入是等号的右边。

always_comb begin//串行语言描述
    a = 1'b1;
    b = a;
    a = 1'b0;
    c = a;
end

always_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中的控制语句:case

case语句常用于描述选择器和译码器。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和for

if和for是always_comb中的常用语法。

if

if和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

for

for在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 < 16; i ++) begin
        if (i >= n) break;
    end
end

for和if即可表示行为,也可生成电路。

always_comb begin
    for (int i = 0; i < 16; i++) begin
        a[i] = b[i] & (c[i] == d[i] | e[i]); // 编译器不认为i是常数,a[i:i+3]非法
    end
end

for (genvar i = 0; i < 16; i++) begin
    assign a[i] = b[i] & (c[i] == d[i] | e[i]); // 编译器认为i是常数,a[i:i+3]合法
    always_comb begin
        
    end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值