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即可。
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路径加上以后可以跑通,然后再注释掉以后发现也可以。。。