内容纲要
近似语法比较
语法 | SpinalHDL | Verilog |
---|---|---|
阻塞赋值 | a := U"h3" |
a <= 4'h3; |
非阻塞赋值 | a \= U"b11" |
`a = 4'b11; |
连线 | a <> b |
.a(b) |
线 | val a = UInt(4 bits) |
wire[3:0] a; |
寄存器 | val a = Reg(UInt(4 bits)) |
reg[3:0] a; |
复位 | always@(posedge clk or negedge rstn) if(!rstn) a <= 4'h0; |
val a = Reg(Uint(4 bits)) init(0) |
条件语句 | when(c===1) {a:=1}.elsewhen(c=\=3) {a:=2}.otherwise{a:=3} |
if(c==1) a<=1; else if (c!=3) a<=2; else a<=3; |
分支语句 | switch(c) is(0){a\=1} is(1){a\=2} default{a\=3} |
case(c) 0: a=1; 1: a=2; default: a=3; endcase |
选择语句 | val a \= c ? U"b1" \| U"b0" |
assign a = c ? 1'b1 : 1'b0 |
重大区别
寄存器定义
在Verilog中,如果需要定义一个寄存器,只需要键入reg a;
就可以了,至于这个寄存器的其他相关代码都需要写在另外的代码块中,包括:驱动时钟、复位条件、更新条件、更新值。
而在SpinalHDL中,寄存器定义一共有4种方式,分别是:
- 无复位寄存器:Reg(type : Data)
- 带复位寄存器:
- RegInit(resetValue : Data)
- Reg(type: Data) init( resetValue: Data)
- 更新寄存器:RegNext(nextValue : Data)
- 带条件更新寄存器:RegNextWhen(nextValue : Data, cond : Bool)