verilog从RTL到仿真simulate和综合DC以及PT总结

原创
2020/09/28 10:16
阅读数 113

1.5'd 28 = -4, 即verilog中的二进制数是有符号数,5'd范围是[-16, 15),从15加1变成-16。

2.对于IO pad的多位输入输出的书写:输入输出都要拆开才行。 PI PAD_PLAINTEXT_0(.PAD(pad_plaintext[0]),.IE(1'b1),.C(plaintext[0])); PI PAD_PLAINTEXT_1(.PAD(pad_plaintext[1]),.IE(1'b1),.C(plaintext[1]));

对于没有set_drive 0的,不需要 set_driving_cell -lib_cell PO2 -pin PAD [remove_from_collection [all_inputs] [get_ports "pad_clk pad_rst"]] 这里是把pad_clk和pad_rst不做pad,因为这两个是set_drive 0,樊迪是这么做的。

4.定义一个寄存器数组 https://blog.csdn.net/Reborn_Lee/article/details/89792979 https://blog.csdn.net/childbor/article/details/76295787 https://forums.xilinx.com/t5/Vivado/system-verilog-%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84%E7%AB%AF%E5%8F%A3%E7%BB%BC%E5%90%88/td-p/963866

32个16位寄存器,郝志坚是用System Verilog写的,他的.sv里面估计是用vivado或者ISE综合的,可以用reg [31:0] [15:0] key来进行表示,并且modelsim也可以通过,但是DC没办法综合,需要改为reg [15:0] key [0:31],并且一维及多维数组无法作为module中的端口,需要进行拆分,具体见simon代码及https://zhidao.baidu.com/question/411371245.html中的分解办法。

verilog-1995只允许书写一维数组并且不能对一维数组取出任一位,需要曲线救国(见链接);verilog-2001允许多维数组,并且可以取出多维数组中的一位或连续几位(见链接)。

5.input不指定wire型还是reg型,所以在高层模块例化时既可以与wire型变量连接,也可以与reg型变量连接,simon中的single_block在simon_pipeline里面例化时就可以连接wire型或者reg型。

6.simon的simon_key采用reg型才可以进行流水线设计,否则全组合逻辑会造成时钟频率较低。

仔细想想来老师的课程可以全用组合逻辑实现不行,需要有状态转移,即该电路的当前状态不但与输入(reset)有关,还与上一个状态有关(状态机的跳转)。

7.assgin只能对wire类型起作用,是组合逻辑,相当于always_comb; reg只能在always里面赋值。

8.DC修改read.tcl为.sv。一般整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。 https://blog.csdn.net/aoan4171/article/details/102201547

9.在高层次模块中声明要用作与低层次模块连接的端口时,该端口用wire型还是reg型与低层次模块的端口属性无关,只看在高层次模块中该端口变量是否在always块中以及在always块中=<=的左边还是右边,always块中=或者<=左边变量的一定得是reg型,即被赋值的一定是reg型,剩下的所有变量都是wire型。

在simon_pipline中如果用system verilog写成的.sv文件中声明的key_total端口不论是wire型还是reg型都可以进行仿真,但是DC综合时如果key_total端口是reg型,因为没有用到该端口的、在=或者<=左边的always块语句,DC会显示Net key_total connected to instance key_generate is declared as reg data type but is not driven by an always block.

在simon_pipline中如果是用纯verilog写成的.v文件中,对key_total以及out_low1、out_high1等对接子模块输入输出端口的变量,因为没有用到这些端口的在=或者<=左边的always块中的语句,所以将他们声明为reg型变量时modelsim仿真时add simulate会报错code 7退出,vivado仿真时elaborate通不过,显示 [VRFC 10-529] concurrent assignment to a non-net key_total is not permitte 即定义的变量不是wire型。当然前提是该变量没有参与=或者<=左边的always块中的语句。 https://forums.xilinx.com/t5/Simulation-and-Verification/Error-message-VRFC-10-529-concurrent-assignment-to-a-non-net-P/td-p/546073 https://stackoverflow.com/questions/49423478/verilog-non-net-value-assignment

10.用vivado跑仿真verilog的时候,不需要用vivado HLS 2018.1,只需要vivado 2018.1即可,create一个project,添加design source(不含test_bench),然后testbench放在simulation sources那里,run simulate即可。 vivado 2018.1

11.跑实验室的DC的时候,因为DC的libraries的syn文件夹中包含了dw_doundation.sldb、standard.sldb以及gtech文件,所以DC可以自动从/home/EDA/synopsys/dc/libraries/syn中获取并loading,但跑PT时第一次显示loading dw_foundation_sldb error,我在pt.tal把qbs的lib路径加上以后可以跑通,然后再注释掉以后发现也可以。。。

展开阅读全文
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部