@@ -146,13 +146,22 @@ always_ff @( posedge clk_i )
146
146
Правильно:
147
147
``` systemverilog
148
148
// GOOD EXAMPLE
149
- always_ff @( posedge clk_i )
149
+ always_ff @( posedge clk_i )
150
150
begin
151
151
pkt_data_d1 <= pkt_data_i;
152
152
pkt_empty_d1 <= pkt_empty_i;
153
153
end
154
154
```
155
155
156
+ Допускается:
157
+ ``` systemverilog
158
+ // GOOD EXAMPLE
159
+ always_ff @( posedge clk_i ) begin
160
+ pkt_data_d1 <= pkt_data_i;
161
+ pkt_empty_d1 <= pkt_empty_i;
162
+ end
163
+ ```
164
+
156
165
## Примеры использования конструкций и операторов
157
166
158
167
### Логические выражения
@@ -170,11 +179,10 @@ assign data_ready = ( pkt_word_cnt > 8'd5 ) && ( !data_enable ) && ( pkt_len <=
170
179
#### Пример #2
171
180
172
181
``` systemverilog
173
- always_comb
174
- begin
175
- if( data_enable && ( fifo_bytes_empty >= pkt_size ) )
176
- ...
177
- end
182
+ always_comb begin
183
+ if( data_enable && ( fifo_bytes_empty >= pkt_size ) )
184
+ ...
185
+ end
178
186
```
179
187
180
188
#### Пример #3
@@ -196,28 +204,24 @@ else
196
204
### ` if-else ` вместе с ` begin/end `
197
205
198
206
``` systemverilog
199
- if( a > 5 )
200
- begin
201
- c = 7;
202
- d = 5;
203
- end
204
- else
205
- begin
206
- c = 3;
207
- d = 7;
208
- end
207
+ if( a > 5 ) begin
208
+ c = 7;
209
+ d = 5;
210
+ end else begin
211
+ c = 3;
212
+ d = 7;
213
+ end
209
214
```
210
215
211
216
### Вложенный ` if-else `
212
217
213
218
``` systemverilog
214
219
if( a > 5 )
215
220
c = 7;
216
- else
217
- if( a > 3 )
218
- c = 4;
219
- else
220
- c = 5;
221
+ else if( a > 3 )
222
+ c = 4;
223
+ else
224
+ c = 5;
221
225
```
222
226
223
227
### Тернарный оператор ` ? `
@@ -241,30 +245,25 @@ assign y = ( a > c ) ? ( cnt_gt_zero ):
241
245
242
246
``` systemverilog
243
247
case( opcode[1:0] )
244
- 2'b00:
245
- begin
248
+ 2'b00: begin
246
249
next_state = OR_S;
247
- end
250
+ end
248
251
249
- 2'b01:
250
- begin
252
+ 2'b01: begin
251
253
next_state = AND_S;
252
- end
254
+ end
253
255
254
- 2'b10:
255
- begin
256
+ 2'b10: begin
256
257
next_state = NOT_S;
257
- end
258
+ end
258
259
259
- 2'b11:
260
- begin
260
+ 2'b11: begin
261
261
next_state = XOR_S;
262
- end
262
+ end
263
263
264
- default:
265
- begin
264
+ default: begin
266
265
next_state = AND_S;
267
- end
266
+ end
268
267
endcase
269
268
```
270
269
@@ -311,41 +310,34 @@ endtask
311
310
312
311
### Еще один пример
313
312
``` systemverilog
314
- if( condition1 )
315
- begin
316
- for( int i = 0; i < 10; i = i + 1 )
317
- statement1;
318
- end
319
- else
320
- begin
321
- if( condition2 )
322
- statement2;
323
- else
324
- if( condition3 )
325
- statement3;
326
- else
327
- statement4;
328
- end
313
+ if( condition1 ) begin
314
+ for( int i = 0; i < 10; i = i + 1 )
315
+ statement1;
316
+ end else begin
317
+ if( condition2 )
318
+ statement2;
319
+ else if( condition3 )
320
+ statement3;
321
+ else
322
+ statement4;
323
+ end
329
324
```
330
325
331
326
## Комментарии
332
327
Комментарии пишутся на английском языке.
333
328
После знака комментария ` // ` ставится один пробел.
334
329
335
- Желательно писать комментарии перед тем блоком, который вы хотите пояснить:
330
+ Желательно писать комментарии перед (возле) тем блоком, который необходимо пояснить:
336
331
``` systemverilog
337
332
338
333
// current packet word number
339
334
always_ff @( posedge clk_i or posedge rst_i )
340
335
if( rst_i )
341
- pkt_word <= 16'd0;
342
- else
343
- // reset counter at last valid packet word
344
- if( pkt_valid && pkt_eop )
345
- pkt_word <= 'd0;
346
- else
347
- if( pkt_valid )
348
- pkt_word <= pkt_word + 1'd1;
336
+ pkt_word <= 16'd0;
337
+ else if( pkt_valid && pkt_eop ) // reset counter at last valid packet word
338
+ pkt_word <= 'd0;
339
+ else if( pkt_valid )
340
+ pkt_word <= pkt_word + 1'd1;
349
341
```
350
342
351
343
Примечание:
@@ -454,10 +446,9 @@ always_ff @( posedge clk_i )
454
446
always_ff @( posedge clk_i or posedge rst_i )
455
447
if( rst_i )
456
448
cnt <= 8'd0;
449
+ else if( srst_i )
450
+ cnt <= 8'd0;
457
451
else
458
- if( srst_i )
459
- cnt <= 8'd0;
460
- else
461
452
...
462
453
```
463
454
@@ -498,31 +489,26 @@ always_comb
498
489
next_state = state;
499
490
500
491
case( state )
501
- IDLE_S:
502
- begin
503
- if( ... )
504
- next_state = RUN_S;
505
- end
492
+ IDLE_S: begin
493
+ if( ... )
494
+ next_state = RUN_S;
495
+ end
506
496
507
- RUN_S:
508
- begin
509
- if( ... )
510
- next_state = WAIT_S;
511
- else
512
- if( )
513
- next_state = IDLE_S;
514
- end
515
-
516
- WAIT_S:
517
- begin
518
- if( ... )
519
- next_state = RUN_S;
520
- end
521
-
522
- default:
523
- begin
497
+ RUN_S: begin
498
+ if( ... )
499
+ next_state = WAIT_S;
500
+ else if( )
501
+ next_state = IDLE_S;
502
+ end
503
+
504
+ WAIT_S: begin
505
+ if( ... )
506
+ next_state = RUN_S;
507
+ end
508
+
509
+ default: begin
524
510
next_state = IDLE_S;
525
- end
511
+ end
526
512
527
513
endcase
528
514
end
@@ -579,10 +565,9 @@ always_comb
579
565
580
566
Пример:
581
567
```systemverilog
582
- always_comb
583
- begin
584
- a = b + d;
585
- end
568
+ always_comb begin
569
+ a = b + d;
570
+ end
586
571
```
587
572
588
573
Категорически ** запрещается** :
@@ -615,11 +600,10 @@ always_ff @( posedge clk_i )
615
600
always_ff @( posedge clk_i or posedge rst_i )
616
601
if( rst_i )
617
602
cnt <= '0;
603
+ else if( cnt == 8'h92 )
604
+ cnt <= 'd0;
618
605
else
619
- if( cnt == 8'h92 )
620
- cnt <= 'd0;
621
- else
622
- cnt <= cnt + 1'd1;
606
+ cnt <= cnt + 1'd1;
623
607
```
624
608
625
609
#### Создание триггеров с начальным ненулевым значением
@@ -748,11 +732,10 @@ logic [2:0] vlan_mpls_cnt;
748
732
// more signals
749
733
750
734
// some code
751
- always_comb
752
- begin
753
- if( vlan_mpls_cnt > 2 )
754
- ...
755
- end
735
+ always_comb begin
736
+ if( vlan_mpls_cnt > 2 )
737
+ ...
738
+ end
756
739
757
740
// calc vlan_mpls_cnt
758
741
logic [1:0] vlan_cnt;
0 commit comments