通用
- 虽然各部分都是并行运行,但变量的声明要放在它首次出现的程序前面。
Quartus
- 分析综合是看语法逻辑,全编译是看能否在fpga上实现。比如逻辑用了5M的片上RAM,综合没问题,但是fpga上只有几K,编译就会报错。
- Error (10028): Can’t resolve multiple constant drivers for net “prbs15[0]” at test.v(24)
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
prbs15 <=15'b000_0000_0000_0001;
else begin
temp <= prbs15[14]^prbs15[13];
for (i = 14; i >= 1; i = i - 1)
begin
prbs15[i] <= prbs15[i-1];
end
out <= prbs15[14];
end
end
always @ (temp) begin
assign prbs15[0] = temp;
end
原因就是在两个always语句里面都对prbs15[0]赋值了,而两个always是并行的,所以提示出现多重驱动的情况。
同一个信号不允许在多个进程中赋值,否则视为多驱动。FPGA进程的并行性决定了多进程不同能对同一个对象进行赋值。
- Error (10219): Verilog HDL Continuous Assignment error : object “prbs15” on left-hand side of assignment must have a net type
output reg [14:0] prbs15;
assign prbs15[0] = temp;
assign只能对wire变量赋值…
- Error (10137): Verilog HDL Procedural Assignment error: object “y” on left-hand side of assignment must have a variable data type
reg x;
wire [2:0] y;
always @(*)begin
if(cnt_c==0)begin
x = 1;
y = 1;
原因:数据类型定义错误 或者 赋值类型错误
解决方法: 在always 过程块中被赋值的变量必须是 reg (寄存器型),用 assign 连续赋值的对象 必须定义成 wire(线型)
- 虽然都是并行的,但是一个变量也得先定义,才能被使用。倒过来不行
reg [2:0] cnt;
wire add_cnt;
wire end_cnt;
reg flag;
reg [2:0] cnt_c;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
cnt <= 0;
end
else if(add_cnt) begin
if(end_cnt)
cnt <= 0;
else
cnt <= cnt + 1;
end
end
assign add_cnt = flag==1'b1;
assign end_cnt = add_cnt &&cnt== cnt_c +1'b1;
flag, cnt_c都是后面always中才产生的变量,如果想和前面的语句产生交互(被使用),必须放在前面定义。否则报错:Undefined variable: ‘cnt_c’.
VIVADO
- [Synth 8-91] ambiguous clock in event control
always敏感变量没有得到使用,比如rst信号
always@(posedge clk or negedge rst_n) begin
case(cnt)
3'd0: q_reg=seq[5];
3'd1: q_reg=seq[4] ;
3'd2: q_reg=seq[3] ;
3'd3: q_reg=seq[2] ;
3'd4: q_reg=seq[1] ;
3'd5: q_reg=seq[0] ;
default: ; //不执行
endcase
end