Verilog 组合电路常见错误和always块的使用原则

一、组合电路常见错误

1、变量在多个always块中连续赋值

reg y;
reg a, b, clear;
always @ *
    if(clear) y = 1'b0;
always @ *
    y = a&b;
//每个always块是电路的一部分,y在两个电路上输出,不能综合

2、不完整的敏感信号列表

always @(a,b)
    y = a&b;
//如果忘记包含b,就会变成如下

always @a
    y = a&b;
//这样可以通过综合,但是对b不敏感,会导致仿真和综合结果不一样

3、不完整分支和不完整赋值

  • 问题现象:组合电路的输出仅仅是由当前输入的取值决定的,而不依赖于任何内部存储的状态。具体来说,组合电路不包含存储元件,如触发器等。它的输出只与当前时刻的输入信号有关,而与之前的输入历史或内部状态无关。
  • 原因:always块中,综合出组合电路的意外存储器。Verilog标准指定always块变量没有赋值则会保持原来的值,在综合时,这将导致内部状态(通过闭合反馈电路)或存储原件的产生存储原件(锁存器)的产生
  • 方法:为了防止always块中,综合出组合电路的意外存储器,所有**输出信号**在任何时候都应该赋与恰当的值
//若 a>b 时为真时,若eq没有赋值,则会保持之前的值,从而会综合出锁存器

//方法一 加上else分支并明确赋值
always @*
    if(a>b)
        begin
            gt = 1'b1;
            eq = 1'b0;         
        end
	else if(a == b)
        begin      
            gt = 1'b0;
            eq = 1'b1;         
        end
	else
    	begin
            gt = 1'b0;
            eq = 1'b0;         
        end

//方法二 在always起始部分给每个变量赋默认的值
always @*
	begin
    	gt = 1'b0;
		eq = 1'b0; 
        if(a>b)
        	gt = 1'b1;
        else
            eq = 1'b1 ; 
    end

二、组合电路always块的使用原则

1、只在1个always块中对变量进行赋值;
2、组合电路采用阻塞赋值的方式
3、在敏感信号列表中使用“ @* ”自动包含全部所有的输入信号不管用没用到
4、确保包含if-else和case语句的所有分支;
5、确保所有分支的输出都被赋值
6、一种满足4和5的方法在always块开始时给输出赋默认值
7、full case和parallel case用代码描述,不用软件指令和属性
8、了解不同控制结构综出的电路的类型
9、思考生成的硬件电路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值