Abstract
以前在貼Verilog代碼時,都只能挑C++或者C#的語法著色,但兩者的keyword畢竟不太一樣, 透過dudu的幫助,我將Verilog 2001的keyword加上了,現在博客園也能漂亮的顯示Verilog代碼了!!
Introduction
以下是個典型的Verilog代碼,現在keyword都能正確顯示,真是太感動了...。
1 module checksum_task_logic (
2 input clk,
3 input reset_n,
4 input go,
5 input data_in_ready,
6 input [31:0] data_to_process,
7 output [15:0] result
8 );
9
10 reg data_in_ready_delay;
11 reg [31:0] data_in_reg;
12 reg [31:0] sum_reg;
13
14 wire [31:0] sum_1;
15 wire [31:0] sum_2;
16 wire [31:0] sum_3;
17 wire [31:0] next_sum_reg;
18
19 // first adder stage (16-bits) fold upper and lower half
20 assign sum_1 = data_in_reg[31:16] + data_in_reg[15:0];
21
22 // second adder state (32-bits) of sum_1 and previously stored sum (sum_reg)
23 assign next_sum_reg = sum_1 + sum_reg;
24
25 // Fold in upper (carry count) and lower half of sum register
26 assign sum_2 = sum_reg[31:16] + sum_reg[15:0];
27
28 // Fold in upper (possible carry) and lower half of sum_2
29 assign sum_3 = sum_2[31:16] + sum_2[15:0];
30
31 // Invert the sum (one's complement) for result
32 assign result = { ~(sum_3[15:0]) };
33
34 // delay register for data_in_ready
35 always@(posedge clk or negedge reset_n) begin
36 if (reset_n == 1'b0)
37 data_in_ready_delay <= 1'b0;
38 else
39 data_in_ready_delay <= data_in_ready;
40 end // always@
41
42 // Write to the data_in register
43 always@(posedge clk or negedge reset_n) begin
44 if (reset_n == 1'b0)
45 data_in_reg <= 32'h00000000;
46 else
47 data_in_reg <= data_to_process;
48 end // always@
49
50 // Write to the sum register the next value
51 always@(posedge clk or negedge reset_n) begin
52 if (reset_n == 1'b0)
53 sum_reg <= 32'h00000000;
54 else if (go) // clears sum_reg at start of checksum calculation
55 sum_reg <= 32'h0000_0000;
56 else if (data_in_ready_delay == 1'b1)
57 sum_reg <= next_sum_reg;
58 else
59 sum_reg <= sum_reg;
60 end // always@
61
62 endmodule