Dskpimc? · 2020年09月11日

芯片设计的一些记录

1、generate用法
  • 定义genvar,作为generate中的循环变量;
  • generate语句中定义的for语句,必须要有begin,为后续增加标签做准备;
  • begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称;
  • 可以使用在generate语句中的类型主要有:

module(模块)
UDP(用户自定义原语)
门级原语
连续赋值语句
nitial或always语句

  • 基本结构如下:
genvar 循环变量名;
generate
    1. generate-loop循环语句
    2. generate-conditional条件语句
    3. generate-case分支语句
    4. 嵌套的generate语句
endgenerate

generate-for例子:

##一个参数化的gray-code to binary-code 转换器,这里采用复制产生多个assign语句的形式来实现
module gray2bin1 (bin, gray);
    parameter SIZE = 8; 
    parameter SIZE = 8; 
    input [SIZE-1:0] gray; 
    genvar i;
    generate  
        for(i=0; i<SIZE; i=i+1) 
        begin: bit 
            assign bin[i] = ^gray[SIZE-1:i]; 
        end
    endgenerate 
endmodule 

generate-if例子:

generate if(MUX_NUM == 0)begin : mux4_1
    always@(*)begin
        data_out = data_in0;
    end
end else if(MUX_NUM = 1) begin : mux3_1
    always@(*)begin
        data_out = data_in1;
    end
end else begin : mux2_1
    always@(*)begin
        data_out = data_in2;
    end
end endgenerate

generate-case例子:

generate
    case(MUX_NUM)
        0:begin:mux_2
        end
        1:begin: mux_3
        end
        2:begin: mux_4
        end
        default:begin
        end
    endcase
end endgenerate
2、跨时钟域信号处理方法

为了避免亚稳态,跨时钟域信号处理分为两类:控制信号的传输,数据信号的传输。控制信号通常是单bit,可以直接采用两级或多级同步解决,不管快到慢,还是慢到快,都可以使用,在快到慢时要注意把快时钟域的输出信号展宽,以便慢时钟域能采集到;数据信号涉及到多bits,如果直接都采用两级或多级同步容易使同步数据错拍,因此目前有两种其它做法,一是DMUX,二是异步FIFO。DMUX实现方法就是简单的xreq和yack握手方法,简单易用,通过这种方法最少需要5拍时钟才能完成一次握手,在latency敏感的电路中不好使。此时可以用异步FIFO实现,异步FIFO说白了就是一个大容器RAM,里面可以装很多数据,并且有指示这个容器满还是空的信号。如果满,写的一方就要暂停往FIFO里面写数据,否则会覆盖未读出来的数据;如果空,则读的一方不能往FIFO里度数据,否则读出来的都是垃圾数据,影响系统功能。实现异步FIFO的主要难点就是空满信号的产生,空信号需要将写时钟域的指针同步到读时钟域,满信号需要将读时钟域的指针同步到写时钟域,由于指针通常是多bit,这又嵌套一个多bit信号同步的问题。目前常用的做法是把二进制读写指针转为格雷码指针,然后就可以采用简单的两级或多级同步方法。异步FIFO释放了写一方的等待周期,如果FIFO不满,就可以一直往里面塞数据,减少latency。读写指针的比较有两种方式:一是直接比较同步过来的格雷码,二是把格雷码转为二进制码再比较,后者比前者多需要四个格雷码转二进制码电路模块,面积更大,时序更差。

3、低功耗处理方法

芯片功耗主要由三部分组成:浪涌电流、静态功耗和动态功耗。浪涌电流与设备相关,如电机启动电流在前几个周期是正常满载电流的数倍;静态功耗与元件的电气特征相关,也包括晶体管漏电流所导致的功耗,Pstatic~CVdd2,t为参数;动态功耗是门电路输出切换时,由逻辑切换所引起的功耗,Pdynamic~SCVdd2f,C为门寄生电容,S为每个时钟通过整个电路的平均转换次数,f为时钟频率。
降低功耗可以在所有设计层次上进行,即系统级、逻辑级和物理级,层次越高对功耗降低可能越有效。这里仅针对以上功耗计算公式和平时有遇到的低功耗手段谈论下。
由功耗公式可知:通过降低电压,可以以平方次幂降低功耗,还有一个就是增加NMOS或PMOS电压开关,在适当时候把某一区域电源断掉,有时可以讲整芯片划分多个电压域,对速度要求低的可以工作在低电压下,反之为高电压,在存储器中可以使用多电压模式供电,如果某块区域不用可以直接断电,如果只需要保存数据,可以通过处理器配置为低电压,只要不丢失数据即可,如果需要读写,则可以配置为全电压模式;通过使用先进工艺,降低寄生电容也可以降低功耗;通过降低f来降低功耗,但是如今追求高速率芯片,这个基本没戏了,有一个思路就是DVFS,即根据实时芯片状态来动态调频调压;降低S,即每次时钟翻转所带来整个电路的平均翻转次数,这个是目前接触比较多的低功耗技术,如时钟门控、one-hot状态机编码和多路选择器和资源复用;还有一个降低功耗的方式是使用多阈值电压晶体管,在时序好收敛处采用高Vt来降低漏电流。

相关阅读

Verdi的一些使用技巧记录
UVM-1.1d源码

作者:谷公子
首发博客:https://blog.csdn.net/W1Z1Q/article/details/105693342
5 阅读 254
推荐阅读
0 条评论
关注数
1789
内容数
255
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息