组合逻辑过程块

本文详细介绍了SystemVerilog中的always_comb过程块,用于定义组合逻辑。always_comb块在仿真开始时会自动执行,并根据输入值即时更新输出,避免了手动指定敏感表。文中还通过一个简单的状态机例子说明了其用法,并指出always_comb块能自动推断敏感表,包括函数内部使用的信号。此外,强调了always_comb块禁止共享变量,确保了组合逻辑的正确性。
摘要由CSDN通过智能技术生成

组合逻辑过程块

always_comb代表组合逻辑
always_comb过程块表示建立组合逻辑模型

always_comb
if(!mode)
	y = a + b;
else
	y = a - b;

always_comb能推断出其敏感表
与通用always过程块不同,always_comb块的后面不需要指明敏感表。软件工具已经知道设计的意图是建立一个组合逻辑模型,因此这个组合逻辑的敏感表可以是自动推断出来的。推断的敏感表包含了所有被过程块读取(所谓读取即信号出现在表达式右边或作为条件语句的条件表达式中,下同)并在块外赋值的信号。那些在此过程中被阻塞赋值语句赋值并且只在该过程块读取的临时变量不包括在敏感表中。SystemVerilog的敏感表中还包括过程中调用函数的所有信号,但只被函数赋值和读取的临时变量除外。

禁止出现共享变量

always_comb过程块仍然要求被赋值的变量不能再次在其他过程被赋值。这样限制避免了非组合逻辑的共享变量的出现。这种限制也符合综合的指导原则,并且确保了所有的软件工具(不仅仅是综合工具)都采用同样的建模规则。
无歧义的设计意图
零时刻自动求值
always_comb确保输出与输入值保持时间一致
always_comb过程块与always过程块的另一个不同之处在于,在所有initial和always过程块启动后,always_comb块会在仿真的零时刻自动出发。不管推断出的敏感表中的信号是否发生了变化,这样的自动求值都会发生。always_comb的这种特殊的语义确保了组合逻辑在零时刻产生与输入相对应的输出结果。特别是在使用缺省值为逻辑0的两态变量建模时,这种零时刻的自动求值显得尤为重要,复位信号很可能不会引起组合逻辑的敏感表中的信号发生变化。而如果没有变化,通用always过程块不会被触发,从而使输出变量也不会变化。

一个采用枚举类型建模的简单有限状态机。
三个可能的状态是WAITE、LOAD、STORE
。状态机复位后处于WAITE状态。状态机的
组合逻辑会对当前状态进行解码,如果当前
状态的组合逻辑为WAITE,则下一个状态为LOAD。
在每个clock信号的上升沿,状态时序逻辑都会将
变量NextState的值赋给变量State

module controller(
		output logic read,write,
		input instr_t instruction,
		input logic clock,resetN
);
enum {WAITE,LOAD,STORE}State,NextState;
always@(posedge clock,negedge resetN)
	if(!resetN) State <= WAITE;
	else State <= NextState;

always@(State)
begin
	case(State)
		WAITE:NextState = LOAD;
		LOAD:NextState = STORE;
	  STORE:NextState = WAITE;
	encase
end

always@(State,instruction)
begin
	read = 0; write = 0;
	if(State == LOAD && instruction == FETCH) read = 1;
	else if(State ==STORE && instruction == WRITE) write = 1;
end
endmoudle
module controller(
		output logic read,write,
		input instr_t instruction,
		input logic clock,resetN
);
enum {WAITE,LOAD,STORE}State,NextState;
always@(posedge clock,negedge resetN)
	if(!resetN) State <= WAITE;
	else State <= NextState;

always_comb
begin
	case(State)
		WAITE:NextState = LOAD;
		LOAD:NextState = STORE;
	  STORE:NextState = WAITE;
	encase
end

always_comb
begin
	read = 0; write = 0;
	if(State == LOAD && instruction == FETCH) read = 1;
	else if(State ==STORE && instruction == WRITE) write = 1;
end
endmoudle

always_comb敏感列表包含函数读取的信号
SystemVerilog中的always_comb过程块则消除了@*的这点缺陷。always_comb过程块内读取的信号和块内调用的函数的信号都敏感。这样编写函数时就不需要形式参数了。在设计过程中,即使函数引用的信号的发生变化,也不需要修改函数形式参数列表和调用函数的代码。

always_comb过程块会对data、sel、c、d和e敏感
always@* //推断出@(data)
begin
	a1 = data << 1;
	b1 = decode();
	...
end

always_comb //推断出@(data,sel,c,d,e)
begin
	a2 = data << 1;
	b2 = decode();
	...
end

funciton decode;//不带输入的函数
begin
	case(sel)
		2'b01: decode = d|e;
		2'b10:decode = d&e;
		default : decode = c;
	endcase
end
endfunction
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻童:CPU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值