跳轉到

附錄 A.1:Veryl 與 SystemVerilog 對照表#

本附錄整理 Veryl 與 SystemVerilog 的語法對照,供有 SV 背景的讀者快速遷移。Veryl 經 veryl build 轉譯為 SV,因此每一條對照都對應實際產出的程式碼。以官方手冊(https://doc.veryl-lang.org)為最終依據。

模組與埠#

Veryl SystemVerilog
module Foo ( port a: input logic<8>, ) { } module Foo (input logic [7:0] a); ... endmodule
module Foo::<W: u32 = 8> ( port a: input logic<W>, ) { } module Foo #(parameter int W = 8) (input logic [W-1:0] a); ... endmodule
埠方向可省略,由編譯器推導 方向必須明寫
inst u: Foo; Foo u (/* .port 連線 */);
inst u: Foo::<8>; Foo #(.W(8)) u (...);
inst u: Foo (bus); Foo u (.bus(bus));(interface 連接)
module Fifo for FifoIF { } (SV 無直接對應,以命名慣例約束)

宣告與賦值#

Veryl SystemVerilog
var x: logic<8>; logic [7:0] x;
let y: logic<32> = a * b; logic [31:0] y; assign y = a * b;
const C: u32 = 1; localparam int C = 1;
param P: u32 = 8; parameter int P = 8;(module 內)
x = 1;(always 區塊內) x = 1;(blocking)或 x <= 1;(nonblocking,Veryl 依時序/組合域決定)
u32 / i32 int unsigned / int
logic<W> logic [W-1:0]
logic<N><M>(二維) logic [M-1:0] x [N](對應 unpacked 陣列,形態以官方文件為準)
位串接 a << b {a, b}
位選切 a[7:4]、a[4 +: 4] 同 SV

always 區塊與 reset#

Veryl SystemVerilog
always_comb { ... } always_comb begin ... end
always_ff (clk, rst) { if_reset { ... } else { ... } } always_ff @(posedge clk or posedge rst) begin if (rst) ... else ... end(依 reset 型別決定同步/非同步)
reset、reset_async_high、reset_async_low、reset_sync_high 等型別 由 sensitivity list 與極性決定,無型別保障
x += 1;(在 always_ff 內) x <= x + 1;

控制流程#

Veryl SystemVerilog
if c { } else if d { } else { } if (c) ... else if (d) ... else ...
case x { A: {}, default: {} } case (x) A: ...; default: ...; endcase
for i: u32 in 0..W { } for (int i = 0; i < W; i++) ...
while c { } while (c) ...

enum / struct / package / function#

Veryl SystemVerilog
enum State: logic<2> { Idle = 0, Run, Done } typedef enum logic [1:0] { Idle = 2'd0, Run, Done } State;
State::Idle Idle(SV enum 值不用 scope 存取)
struct S { a: logic<8>, b: logic<4> } typedef struct packed { logic [7:0] a; logic [3:0] b; } S;
s.a s.a
package P { const A: u32 = 1; } package P; parameter int A = 1; endpackage
P::A P::A
function F(a: u32) -> u32 { return a + 1; } function automatic int unsigned F(int unsigned a); return a + 1; endfunction

interface 與 modport#

Veryl SystemVerilog
interface Bus { var vld: logic; modport m { vld: output } } interface Bus; logic vld; modport m(output vld); endinterface
interface Bus::<W: u32> { ... } interface Bus #(parameter int W = 8); ... endinterface(SV interface 可參數化,但 tooling 支援不一)
inst b: Bus; Bus b();

generate#

Veryl SystemVerilog
if COND: u32 == 0 { }(labelled generate if) if (COND == 0) begin : u32 ... end
for i: u32 in 0..W { }(generate for) for (genvar i = 0; i < W; i++) begin ... end

embed 與外部連接#

Veryl SystemVerilog
embed (inline) {{ ... }} 內容原樣嵌入輸出 SV
embed (cocotb) sv {{ ... }} 配 #[test(name)] 以 cocotb(Python)做驗證,SV 側為接合程式碼
$sv::identifier 直接引用 SV 識別字(Veryl 內以 $sv namespace 表示)
內建函式如 $clog2(W) $clog2(W)(系統函式直接沿用)

工具鏈對照#

Veryl 對標概念
verylup rustup(工具鏈版本管理)
veryl build / veryl check cargo build / cargo check(check 不產檔,僅檢查)
veryl fmt rustfmt
veryl doc rustdoc
veryl test cargo test
veryl publish cargo publish
Veryl.toml([project]/[build]/[format]/[test]/[doc]) Cargo.toml