Coding guidelines: biến quy ước thành hợp đồng kiểm được

Khoảng 35 phútMức 2/3Bản nháp: một số khẳng định chưa đối chiếu spec

Sau bài này bạn sẽ

  • Tách quy ước dễ đọc khỏi yêu cầu chức năng và luật ngôn ngữ
  • Dùng một procedural owner cho state và ưu tiên reset/clear/load rõ
  • Kiểm priority trên mọi state, control và dữ liệu của ví dụ

Style guide cần trả lời lỗi nào nó ngăn được

Một checklist như “reset trước, dùng NBA, đặt tên rõ” chỉ hữu ích khi gắn với contract. Bài chọn register 4 bit, reset đồng bộ active-low ưu tiên hơn clear, clear hơn enable load, còn lại giữ state. Các nhánh chồng lấn được đưa vào test thay vì chỉ đọc code rồi tin đúng.

Một owner cho state không phải một block cho mỗi bit

Mỗi state cần quyền ghi rõ; trong ví dụ q chỉ được gán bởi một clocked process. Một process có thể sở hữu nhiều register liên quan, và nhiều bit trong một vector không cần tách thành hàng loạt block. Tránh nhiều writer độc lập hoặc reset từ nơi khác mà không có hợp đồng. Đây là guideline về cấu trúc và khả năng review, không tuyên bố mọi dạng cú pháp khác đều bất hợp lệ.

Ưu tiên phải đúng cả khi control cùng bật

TB kiểm reset 0 cùng clear 1/en 1 vẫn ra 0; khi reset nhả nhưng clear 1, clear vẫn thắng data. Chỉ khi reset 1/clear 0/en 1 mới load d, còn reset 1/clear 0/en 0 giữ state. Nếu chỉ kiểm mỗi control riêng, một cây ưu tiên viết sai vẫn có thể pass. Expected dùng bảng control index độc lập với cách đặt if trong RTL.

Width, reset và implicit net là lựa chọn có ý nghĩa

Register và dữ liệu đều 4 bit; các port được nối rõ và default_nettype none hạn chế implicit wire do typo. Reset là synchronous trong bài, nên output được kiểm sau cạnh. Không tự đổi sang asynchronous chỉ vì một style guide khác dùng nó. Default_nettype không bắt được tên sai nhưng vẫn trỏ tới biến hợp lệ; chức năng vẫn phải được kiểm.

Preload state qua interface thay vì force vào DUT

Mỗi ca nạp state khởi đầu bằng một clock load hợp lệ, xác nhận nó rồi mới áp control/dữ liệu cần thử. Không force q hoặc sửa hierarchy để “đạt coverage”. Có 16 state,8 control pattern và 16 giá trị d, thành 2048 ca; mỗi ca có setup và observation thật. Quy trình này kiểm cả khả năng đi tới state lẫn priority từ state ấy.

2048 ca, đủ reset/clear/load/hold

Kỳ vọng trước chạy là 1024 reset,512 clear,256 load và 256 hold. Q có 4 bit storage, không latch.

Thí nghiệm guidelines

Trước chạy:16 state x 8 controls x 16 data=2048; reset 1024/clear 512/load 256/hold 256; mỗi ca preload qua interface rồi kiểm priority.

priority_register.sv RTL
`timescale 1ns/1ps`default_nettype nonemodule priority_register(input wire clk,rst_n,clear,en, input wire [3:0] d, output reg [3:0] q);  always @(posedge clk) begin    if(!rst_n) q<=0;    else if(clear) q<=0;    else if(en) q<=d;  endendmodule`default_nettype wire
tb_guidelines.sv testbench
`timescale 1ns/1psmodule tb_guidelines;  reg clk=0,rst_n=0,clear=0,en=0;  reg [3:0] d=0;  wire [3:0] q;  integer state,c,value,want,cases=0,resets=0,clears=0,loads=0,holds=0;  priority_register dut(.*);  always #1 clk=~clk;  task automatic drive_check(input reg r,cl,e,input reg[3:0] data,wanted);    @(negedge clk);rst_n=r;clear=cl;en=e;d=data;    @(posedge clk);#0.1;    if(q!==wanted) $fatal(1,"priority mismatch r=%b clear=%b en=%b q=%h expected=%h",r,cl,e,q,wanted);  endtask  initial begin    for(state=0;state<16;state=state+1)      for(c=0;c<8;c=c+1)        for(value=0;value<16;value=value+1) begin          drive_check(1,0,1,state[3:0],state[3:0]);          case(c)            0,1,2,3:begin want=0;resets=resets+1;end            6,7:begin want=0;clears=clears+1;end            5:begin want=value;loads=loads+1;end            default:begin want=state;holds=holds+1;end          endcase          drive_check(c[2],c[1],c[0],value[3:0],want[3:0]);          cases=cases+1;        end    if(cases!=2048||resets!=1024||clears!=512||loads!=256||holds!=256) $fatal(1,"priority coverage mismatch");    $display("GUIDELINE CHECK cases=%0d reset=%0d clear=%0d load=%0d hold=%0d",cases,resets,clears,loads,holds);    $finish;  end  initial begin #20000;$fatal(1,"priority watchdog");endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Lint -Wall (Verilator 5.050)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Icarus Verilog 11.0, 4-state)
  • Tổng hợp, số cell khớp kỳ vọng (Yosys 0.70)

Output phải khớp: GUIDELINE CHECK cases=2048 reset=1024 clear=512 load=256 hold=256

Kỳ vọng sau tổng hợp: priority_register: $_*DFF* = 4priority_register: $_*DLATCH* = 0

Không seed state bằng force/hierarchy; mỗi biến state một writer. Generic synthesis 4 FF, không chứng minh mọi guideline hoặc mọi clock/reset.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

Checker sample sau NBA, có watchdog và case inequality; parse/lint/sim/synthesis đều đạt đúng phạm vi. Đây không phải formal proof mọi thiết kế dùng guideline. [1]

Tự kiểm tra

Tự kiểm tra: guidelines

  1. Reset 0, clear 1, en 1, dF cùng cạnh trong bài cho q gì?
  2. 16 state x 8 control x 16 data tạo bao nhiêu ca?
  3. Một owner cho state có nghĩa bắt buộc một always cho mỗi bit không?
  4. TB đưa q vào state ban đầu bằng cách nào?
  5. Reset 1,clear 0,en 0 có yêu cầu gì?

Review contract trước khi review dấu cách

Chốt ownership, width/sign, reset priority, enable và điểm sample. Guideline giúp diễn đạt nhất quán; expected và report kiểm điều nó có thực sự làm. Nguồn coding style chỉ là tham khảo, không biến cách viết ngắn hơn thành PPA tốt hơn. [2]

Nguồn và mức độ đối chiếu

  1. Thí nghiệm nguyên bản ex.a8.guidelines, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
  2. Verilog Coding Style Effect — bản chụp trong resources.zip, Style và report. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. IEEE 1800-2023 SystemVerilog LRM, guidelines language semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  4. Thí nghiệm nguyên bản ex.a8.guidelines, Source/assertions/verification.json và probe ghi rõ trong bài. Trích dẫn; nguồn đã đọc toàn văn.
  5. IEEE 1800-2023 SystemVerilog LRM, guidelines semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  6. Verilog Coding Style Effect — bản chụp trong resources.zip, RTL Schematic vs Optimized Netlist; Resource Sharing. Trích dẫn; nguồn đã đọc các mục liên quan.
  7. Thí nghiệm nguyên bản ex.a8.guidelines, Source, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.