verilog的语法注意点
if....else语句和case语句的区别:
理论上,if..else语句是串行的逻辑结构,case语句是并行的逻辑结构。但经过编译器优化后 if...else结构也可能被优化为并行结构。
if语句可以不加else部分,但是,在综合后,则会多产生寄存器用于保存if中的逻辑式的值。
同样,若case语句中不加default部分,也会多产生寄存器用于保存if中的逻辑式的值。
verilog中一般不用for语句,因为for语句占用的硬件资源比较多,在for语句使用的时候,注意阻塞赋值'='和非阻塞赋值'<=',在always语句中使用非阻塞赋值时,是在always结束后才把值赋给左边的寄存器
当inout端口作为输入口使用时,一定要把它设置为高阻态。
inout io_data;
reg out_data; //需要输出的数据
reg io_link; //inout口方向控制
assign io_data=io_link?out_data:1'bz;
给代码注释时,应该假定读者是一个有经验的工程师,他熟悉verilog语言本身,但对于该工程并不熟悉。注释的最高境界是:抛开源代码,单从注释就能明白设计者索要实现的功能。
所谓异步复位,是指复位信号和系统时钟信号的触发可以在任何时刻,二者相互独立。如 always@(posedge clk or negedge rst_n)
同步复位
always@(posedge clk) begin
if(!rst_n) b<=1'b0;
else b<=a;
end
异步复位存在亚稳态隐患,同步复位该隐患稍弱,但消耗资源稍多。
一般情况下,不在顶层模块做任何逻辑设计,哪怕只是一个逻辑与操作,比较好的设计会明确地区分每一个模块单元。