概述
电路语句(三):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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复