错误 (10200):top_module.v(12) 处的 Verilog HDL 条件语句错误:无法匹配操作数

问题描述 投票:0回答:1

我有一个代码的三个版本,我不想要逻辑明智,但为什么语法明智。

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q); 
    always@(posedge clk or posedge areset)
        begin
            if(areset)
                q<=0;
            if(load | ena) 
                begin
            q[3]<=(0 & (~load) & ena)  | (load & data[3]) ;
            q[2]<=(q[3]& (~load) & ena)  | (load & data[2]) ;
            q[1]<=(q[2]& (~load) & ena)  | (load & data[1]) ;
            q[0]<=(q[1]& (~load) & ena)  | (load & data[0]) ;
                end
           else
              q<=q;
            
        end
    
endmodule

上面的代码导致了错误。

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q); 
    always@(posedge clk)
        begin
            if(areset)
                q<=0;
            if(load | ena) 
                begin
            q[3]<=(0 & (~load) & ena)  | (load & data[3]) ;
            q[2]<=(q[3]& (~load) & ena)  | (load & data[2]) ;
            q[1]<=(q[2]& (~load) & ena)  | (load & data[1]) ;
            q[0]<=(q[1]& (~load) & ena)  | (load & data[0]) ;
                end
           else
              q<=q;
            
        end
    
endmodule

上面这个不会导致错误。

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,
    input ena,
    input [3:0] data,
    output reg [3:0] q); 
    always@(posedge clk or posedge areset)
        begin
            if(areset)
                q<=0;
            else if(load | ena) 
                begin
            q[3]<=(0 & (~load) & ena)  | (load & data[3]) ;
            q[2]<=(q[3]& (~load) & ena)  | (load & data[2]) ;
            q[1]<=(q[2]& (~load) & ena)  | (load & data[1]) ;
            q[0]<=(q[1]& (~load) & ena)  | (load & data[0]) ;
                end
           else
              q<=q;
            
        end
    
endmodule

这个也不会导致错误。

verilog quartus
1个回答
0
投票

从 Verilog 语言的角度来看,第一个代码示例中不存在语法错误。

但是,从综合的角度来看,存在错误。 综合的要求是您的代码必须匹配特定模式,以便综合工具可以将行为代码映射到支持的逻辑门。以下模式与您的综合工具映射到的任何内容都不匹配:

always@(posedge clk or posedge areset)
    begin
        if(areset)
            q<=0;
        if(load | ena) 

支持第二个代码示例,因为您从敏感度列表中删除了

posedge areset

always@(posedge clk)

还支持第三个代码示例,因为您将

if
更改为
else if
:

        else if(load | ena) 

请参阅可合成的构造进行讨论。 您的综合工具文档还应该讨论支持的语法。

© www.soinside.com 2019 - 2024. All rights reserved.