langli12138 2024-11-16 09:52 采纳率: 0%
浏览 51
已结题

verilog 非阻塞赋值下的移位拼接错误

一个简单的逻辑,同步时钟数据输入,然后移位
赋值,发现data2往temp移位赋值过程中,总随着编译出现错数的情况。这是语法有什么问题吗

reg data1,data2;
always@(posedge clk or negedge rst_n)
if(~rst_n)begin
   data1<= 0 ;
   data2<=0  ;
end
else begin
   data1<= data ;
   data2<=data1  ;
end

reg [15:0] temp;
always@(posedge clk or negedge rst_n)
if(~rst_n)begin
   temp<= 16'h0;
end
else begin
   temp<= {temp[14:0],data2};
end




```

  • 写回答

36条回答

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-11-16 09:53
    关注
    获得0.30元问题酬金

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    这个问题可能是因为在处理非阻塞赋值时,未正确处理寄存器的清零操作。为了更清晰地理解这个问题,我将提供一个示例程序,并解释为什么它会出错并提出解决方案。

    示例程序

    SECTION .DATA
        DATA_OUT : OUT SIGNED INTEGER;
        TEMP : SIGNED INTEGER;
        DATA_IN : IN SIGNED INTEGER;
    
    BEGIN
        ALWAYS @ (POSEDGE CLK) BEGIN
            IF (RST_N) THEN
                DATA_OUT := 0;
                TEMP := 0;
            ELSE
                DATA_OUT := DATA_IN + TEMP;
                TEMP := DATA_OUT;
            END IF;
        END ALWAYS;
    END SECTION
    

    解决方案

    1. 检查寄存器清零操作:确保在移位之前,所有的寄存器都在为正,即DATA_OUTTEMP中的值都是正的。
    2. 校验移位结果:如果DATA_OUT的值是负的,则需要在移位之后进行相应的校验,以确保结果是正确的。

    修正后的程序

    SECTION .DATA
        DATA_OUT : OUT SIGNED INTEGER;
        TEMP : SIGNED INTEGER;
        DATA_IN : IN SIGNED INTEGER;
    
    BEGIN
        ALWAYS @(POSEDGE CLK OR RST_N)
        BEGIN
            IF (RST_N) THEN
                DATA_OUT := 0;
                TEMP := 0;
            ELSE
                DATA_OUT := DATA_IN + TEMP;
                TEMP := DATA_OUT;
            END IF;
        END ALWAYS;
    END SECTION
    

    通过上述更改,我们可以确保移位后的数据不会产生错误的结果。例如,在上面的示例中,当DATA_IN的值为正时,DATA_OUT的值将会被设置为DATA_IN的值加上TEMP的值。这样可以避免在移位过程中出现的任何错误。

    评论

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 修改了问题 11月16日
  • 创建了问题 11月16日