← eetop.cn_数字IC设计工程师笔试面试经典100题(大部分有答案)
推荐答案
测试一下
题目
用verilog编程,语法要符合FPGA设计的要求
参考答案与知识点
参考答案
本题要求编写符合FPGA设计要求的Verilog代码。核心考点在于理解可综合Verilog的风格与FPGA实现约束。
1. 使用always块时,组合逻辑推荐用阻塞赋值(=),时序逻辑推荐用非阻塞赋值(<=),以避免竞争与仿真错误。例如:always @(posedge clk) q <= d;
2. 避免在组合逻辑中产生锁存器:if-else或case语句必须覆盖所有分支,或给default赋值;否则综合出锁存器,影响时序与资源。
3. 禁止使用不可综合语句:如initial(除仿真外)、fork-join、延时#、系统函数$display等。
4. 推荐使用同步复位、同步置位:复位信号应与时钟沿对齐,避免使用异步复位带来的亚稳态问题(除非设计需要异步复位且做同步释放处理)。
5. 模块端口建议均为wire类型,内部定义reg或wire;对于输出端口,若需时序赋值需声明为output reg。
6. 多时钟域交互需同步处理,不能直接赋值;使用两级D触发器或FIFO进行跨时钟域同步。
7. 避免使用整数(integer)作为循环变量综合大型硬件,尽量使用generate for替代always中的for循环以控制展开。
8. 三态门需配合外部管脚声明,内部总线推荐使用多路选择器或桶形移位器实现。
示例:一个计数器的可综合写法如下:
module counter (
input clk,
input rst_n,
output reg [7:0] cnt
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 8'b0;
else
cnt <= cnt + 1;
end
endmodule
易错点:混用阻塞和非阻塞赋值、组合逻辑中未完整赋值导致锁存器、误用不可综合构造、遗忘同步复位处理。
涉及知识点
- 可综合Verilog语法规范
- 阻塞与非阻塞赋值区别
- 锁存器生成条件与避免
- 同步/异步复位设计
- 不可综合语句识别
- 跨时钟域同步方法