我是靠谱客的博主 内向硬币,最近开发中收集的这篇文章主要介绍SystemVerilog语法基础——5电路语句(三):always_comb前言一、always_comb二、always_comb中的控制语句:case三、always_comb中的控制语句:if和for,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

电路语句(三):always_comb

  • 前言
  • 一、always_comb
  • 二、always_comb中的控制语句:case
    • unique case(独特)
    • priority case(优先级)
  • 三、always_comb中的控制语句:if和for
    • if
    • for

前言

视频语法学习: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

最后

以上就是内向硬币为你收集整理的SystemVerilog语法基础——5电路语句(三):always_comb前言一、always_comb二、always_comb中的控制语句:case三、always_comb中的控制语句:if和for的全部内容,希望文章能够帮你解决SystemVerilog语法基础——5电路语句(三):always_comb前言一、always_comb二、always_comb中的控制语句:case三、always_comb中的控制语句:if和for所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部