1. Testbench中时钟和数据比特流的简单设计方法
always clock = ~clock;
always @(posedge clock)
begin
data_in_a = {$radom} % 2; // 产生-1到1之间随机的比特流
data_in_b = 16’b1101_1011_1110_0011; // 产生固定的比特流
$display(“a= %d\n”, a); // 与C语言类似
end
2. Verilog语法中的并行与顺序模块
(1) 连续赋值语句、always模块之间、实例模块之间都是并行语句
(2) always模块内部是分情况而定,对于if…else…而言,总是有优先级的顺序的,对于case而言,无优先级,是完全顺序执行的,此外,还要对阻塞语句和非阻塞语句具体分析。
3. Verilog中四种最常见的变量
(1) wire,即线网形变量,它不能存储值,必须受到驱动器或者连续赋值语句的驱动,如果没有驱动,那么它将会是高阻态
(2) reg是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用与改变触发器存储的值相当。寄存器变量的初时值为不确定态。在always内部用到的变量必须是reg型的。
(3) prarmeter相当与VHDL中的constant
4. 注意区分集中容易混淆的运算符
(1) 位运算符,按位操作~、|、&、^,其输出与输出一样位宽
(2) 逻辑运算符,输出0或者1,&&、||、!
(3) 缩减运算符,按位递归运算&、|、!、其输出是1或者0
5. 阻塞语句(blocking)与非阻塞赋值语句(non-blocking)
(1) 非连续赋值语句(non-blocking)(b <= a)
在always块结束后才完成赋值操作,并且赋值后b不是立即就改变,在时序逻辑或者既有时序逻辑也有组合逻辑中一定要用这种赋值方式
(2) 阻塞语句(blocking)(b = a)
赋值之后,b就立即改变,也就是在赋值语句完成以后,always才结束,在综合时,如果不注意,将产生意想不到的结果
6. 使用if或者是case进行综合时,一定要覆盖所有可能的情况,防止综合生成锁存器
7. 写testbench一些常见的保留字
$display(“print_word_value = %d”, print_word_value); // 与C语言类似
$display(“%h, %o”, 12’b1101_0100_0111); // 结果是 0xD47和o6507
$monitoron; // 监控开始
$mointor($time, “rxd = %b”, “txd = %b”, rxd, txd); // 打印当前时刻的监控值
$monitoroff;
$finish; // 仿真结束
$readmemb(“数据文件名”, 存储器名); // 把数据读入到当前指定的存储器内
rand_data = {random} % 60; // 产生-59到59之间的随机数
8. 比较下面代码,分别综合出什么,可能出现什么问题
module dff_en(I_en, I_data, I_clock, O_data);
input I_clock;
input I_en;
input I_data;
output O_data;
reg R_data;
assign O_data = R_data;
always @(I_clock)
begin
if (I_en == 1) R_data <= I_data;
end
endmodule
有以下告警(用synplify综合)
(1) Incomplete sensitivity list - assuming completeness
(2) Referenced variable I_en is not in sensitivity list
(3) Referenced variable I_data is not in sensitivity list
(4) Latch generated from always block for signal
如果改always @(I_clock)为always @(posedge I_clock)就可以避免,并产生一个带使能的DFF
9.逻辑综合结果是什么?
module mux2s1(I_sel, I_a, I_b, O_c, O_d)
input I_sel, I_a, I_b;
output O_c, O_d;
reg R_c;
reg R_d;
assign O_c = R_c;
assign O_d = R_d;
always @(I_sel, I_a, I_b)
begin
case (I_sel)
1'b0: R_c = I_a; // 综合出latch
1'b1: R_d = I_b; // latch
endcase
end
endmodule
该逻辑将产生锁存器。
结构仿真是:对电路的逻辑网表验证
文章评论(0条评论)
登录后参与讨论