Verilog毕竟是硬件描述语言,使用Verilog这类HDL语言的目的始终是对电路的建模,并最终得到工具转换出来的实际电路,所以写代码的过程中要能抽象出对应的电路。
但同时,Verilog毕竟还是一种程序语言,就像其他程序语言一样,所以仍然需要熟悉它的语法特性,这样才可以在遇到不熟悉的代码风格时候,能抽象出相应电路或者找出建模过程中出错的地方。
本文关注于常见代码风格的建模效果以及综合是否改变仿真结果。
---
系统环境:Centos 6.5
测试工具:Questasim 10.1b
综合工具:DC 2013.03(针对ASIC)
波形工具:Verdi 2013
----
case
1.译码器
以3-8译码器作为例子来看case的建模效果。代码和tb分别如下:
// 3-8 decoder
module case_endcase_basic( input [2:0] data_in, output [7:0] data_out ); reg [7:0] data_out_reg; always @ (*) begin case( data_in ) 3‘h0: data_out_reg = 8‘b0000_0001; 3‘h1: data_out_reg = 8‘b0000_0010; 3‘h2: data_out_reg = 8‘b0000_0100; 3‘h3: data_out_reg = 8‘b0000_1000; 3‘h4: data_out_reg = 8‘b0001_0000; 3‘h5: data_out_reg = 8‘b0010_0000; 3‘h6: data_out_reg = 8‘b0100_0000; 3‘h7: data_out_reg = 8‘b1000_0000; endcase end assign data_out = data_out_reg; endmodule
// 3-8 decoder testbench
module case_endcase_basic_tb; reg [2:0] data_in; wire [7:0] data_out; initial begin data_in = 0; #10 data_in = 1; #10 data_in = 2; #10 data_in = 3; #10 data_in = 4; #10 data_in = 5; #10 data_in = 6; #10 data_in = 7; #10 data_in = 8; #10 $finish; end `ifdef DUMP_FSDB initial begin $fsdbDumpfile("test.fsdb"); $fsdbDumpvars; end `endif case_endcase_basic case_endcase_basic_instance( .data_in ( data_in ), .data_out( data_out ) ); endmodule
使用QuestaSim仿真后,得到的波形图:
DC综合之后效果图:
使用 综合后的网标文件和sdf文件进行后仿真,波形图如下:
可以看出在信号稳定的时候,综合后的仿真效果和综合前的是一样的。而对于两个不同输入值之前出现的“0”值,可以判断是cell的1->0 比0->1的传播速度要快。
Verilog 几种代码风格的建模效果
时间: 2024-10-22 12:07:23