这一节简单聊聊 assign & always & for 三种语句中会出现的代码规范问题。
代码规范(三)
一、assign语句
1. 数值的实际位宽大于指定的位宽会导致截位。如果截掉的bit中非全零,可能会错;(Spyglass Assign Rules W19)
- 2'b111: 发生截位,会报W19;
- 2'b011:默认不会报,但是若设置了strict,则会报W19
- 2'd15, 1’d3:发生截位,会报W19;
- 2'd03, 4'd0014:虽然发生截位,但是不报W19,因为截断位都是0;
- 3'hF, 2'o7:会报错
- 3'h1, 2'o1:虽截位但是不报错;
2. assign赋值两边的位宽不匹配(Spyglass Rule RHS>LHS, W164a)(Spyglass Rule RHS<LHS, W164b)
对于W164a,会导致溢出、截位,造成数据丢失:
//Example 1
wire a,b;
assign a = b + 4 ; //Violation reported with strict
//Example 2
A [11:0] = { 3’b000, b[9:0] } ; //no violation,leading zeros can ignore;
对于W164b,允许出现,综合会自动补零,但是不建议出现。
位宽的不匹配主要是出现在运算后,这部分在这里不赘述;
3. 除了testbench,不要在赋值中使用delay,因为不可综合;(Spyglass Assign Rules W280, W257)
a <= #10 b;
4. 时序逻辑块中使用非阻塞赋值,组合逻辑块中使用阻塞赋值;(Assign Rules W336)
module fbosc1(y1,y2,clk,rst);
output y1, y2;
input clk, rst;
reg y1, y2;
always @(posedge clk