一、组合电路常见错误
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、思考生成的硬件电路