1、两寄存器交换值方式:
always @(posedge clk) begin
a = b ;
end
always @(posedge clk) begin
b = a;
end
/*
上述方式错误:2 个 always 块中的语句是同时进行的,但是 a=b 与 b=a 是无法判定执行顺序的,这就造成了竞争的局面;2 个 always 块中的语句是同时进行的,但是 a=b 与 b=a 是无法判定执行顺序的,这就造成了竞争的局面
*/
always @(posedge clk) begin
a <= b ;
end
always @(posedge clk) begin
b <= a;
end
/*
正确交换:2 个 always 块中语句并行执行,赋值操作右端操作数使用的是上一个时钟周期的旧值,此时 a<=b 与 b<=a 就可以相互不干扰的执行,达到交换寄存器值的目的。
*/
always @(posedge clk) begin
temp = a ;
a = b ;
b = temp ;
end
/*
正确交换:代码是顺序执行,也可以实现交换寄存器值的功能。
*/
重点题目:
2、verilog设计中,当发生违例时,该怎么处理:
发生hold违例,牺牲setup保持hold;
发生setup违例,修改设计;
发生hold违例,添加延迟模块(buf),增加数据的延迟;
发生setup违例,要降低工作频率,提高时钟周期,才可以解决,一般不推荐;
Tslacksu = Tclk +Tskew - Tco - Tsu - Tcomb Tslackh = Tco + Tcomb - Tskew 设计者只能从组合逻辑部分入手,因此不可能做到同时增大两者的slack,做以平衡才是我们的目的。
3、Verilog的算数运算中,11%-3的结果为2,-10%3的结果为-1;
因为在进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位。
4、CPLD与FPGA都是通用可编程逻辑器件,两者区别?:
FPGA的集成度和复杂度均高于CPLD,所以FPGA可实现复杂逻辑电路设计。
FPGA工艺多为SRAM、flash等工艺,掉电后内信息消失,所以该类型需外配存储器;
CPLD工艺多为EEPROM等工艺,掉电后信息不消失,所以不用外配存储器。
5、可进行综合的verilog语句:
instantitation 实例化 可综合;
以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
event在同步test bench时更有用,不能综合。
不支持force和release的综合。
所有综合工具都支持的结构 always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter, generate ;
所有综合工具都不支持的结构 time,defparam,$finish,fork,join,initial,delays,UDP,wait 有些工具支持有些工具不支持的结构 casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while ;