sky12笔记

本文介绍了Verilog设计中关于ROM初始化、always块错误(如敏感列表不全、if-else/case条件不全、One-Hot译码器处理、避免latch产生、默认值使用和组合逻辑循环问题)及其解决方案。
摘要由CSDN通过智能技术生成

ROM (read only memory)的初始值用系统函数 r e a d m e m b / readmemb/ readmemb/readmemh把文件读进来

parameter READ_PATH = "../rtl/lut.mif";
initial begin
	$readmemb(READ_PATH ,mem);
end

always组合逻辑常见错误
1.敏感列表变量不全,会导致RTL sim和Gate sim结果不一致,也就是仿真和综合结果不一致,仿真时c的变化不触发out1,但是在综合电路里触发。因此要做lint check,语法规则检查。

always@(a or b)begin
	out1 = a+b-c;
end

2.if-else 或 case条件没有列全,导致综合出latch。综合出latch请看

3.One-Hot 译码器:

wire [3:0] sel;//designer must make sure just one-bit is 1'b1 at any time
wire [3:0] d;
reg        out ;
always @(*)begin
casex(sel)
	4'b1xxx: out = d[0]; //synopsys full_case parallel_case 
	4'bx1xx: out = d[0]; //告诉综合工具这是one-hot编码,case是全的且四个分支平行运算
	4'bxx1x: out = d[0]; //如果不写,case不全,还有4'b0000这种情况
	4'bxxx1: out = d[0];
endcase
end

另一种写法:

always @(*)begin
case(1'b1)            //synopsys full_case parallel_case 一定要加上综合directive
	sel[0] : out = d[0];//如果sel[0],[1],[2],[3]都为0,都不匹配,out为维持状态,相当于条件不全,会综合出latch
	sel[1] : out = d[1];//语法上从上往下匹配,综合出有优先级的mux,因此要加parallel_case告诉工具优先级一样
	sel[2] : out = d[2];//综合log文件里可以看到full parallel user字样,否则log里会出现latch
	sel[3] : out = d[3];
endcase
end

4.在always block 开始赋default值,这样即使if-else /case不全,也不会综合成latch。不全时直接使用default值。
5.组合逻辑回圈(combination logic loop)可能导致rtl sim 挂死,仿真时间不往前推进。

wire [7:0] a,b,c;
reg  [7:0] mux_sel;
wire       sel;

assign a = c + mux_sel;
always @ (*) begin
	if(sel)
		mux_sel = a;
	else
		mux_sel = b;
end
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值