自学内容网 自学内容网

sky12笔记

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

原文地址:https://blog.csdn.net/weixin_43369700/article/details/137817220

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!