【问题标题】:Error while checking syntax检查语法时出错
【发布时间】:2017-02-14 06:09:40
【问题描述】:
module mult(a, b, p);     
input [16:0] a;     
input [16:0] b;     
output p;    
wire [31:0] p;   
reg i;       
wire pv;     
wire bp; 
assign pv = 32'b0; 
assign bp = {16'b0,b} ; 
initial begin 
for (i = 0; i < 32 ; i = i + 1)     
    begin       
    if (a[i] == 1'b1)           
    begin               
       pv <= pv + bp;           
    end                 
    bp <= bp << 1 ;     
    end 
end 
assign p = pv;   
endmodule

编译代码时出现以下错误, 第 37 行对标量线“pv”的引用不是合法的 reg 或变量左值 第 37 行非阻塞赋值的非法左侧 第 39 行对标量线 'bp' 的引用不是合法的 reg 或变量左值 第 39 行非阻塞赋值的非法左侧

请帮忙。

【问题讨论】:

  • 这段代码表明缺乏对基本 Verilog 概念的理解。在尝试修复代码之前,了解wire vs reg vs integer 以及 assign vs initial vs always 和阻塞分配 (=) 和非阻塞分配 (&lt;=)

标签: verilog xilinx xilinx-ise


【解决方案1】:

always 和初始块中赋值的左侧必须是寄存器。 pv 和 bp 是电线而不是寄存器。

您不能将变量放在 assign 的左侧并始终同时阻塞。因为总是需要寄存器和分配需要电线。

我在您的代码中看到了明显的语义错误。您需要学习 Verilog 的基础知识。你把 assign 这意味着你期望一个连续的分配,但一个初始块在模拟开始时只执行一次。 顺便说一句,默认情况下输出是有线的。您可以将其声明为输出 [31:0] p;

【讨论】:

  • 如果我将寄存器分配给 pv 和 bp。我收到以下错误 vERROR:HDLCompilers:246 - "mult.v" line 30 Reference to scalar reg 'pv' is not a legal net lvalue ERROR:HDLCompilers:53 - "mult.v" line 30 Illegal left hand side of Continuous分配因此我把它作为reg,我该怎么办?
  • ERROR:HDLCompilers:247 - "mult.v" line 31 对标量线 'pv' 的引用不是合法的 reg 或变量左值 ERROR:HDLCompilers:44 - "mult.v" line 31 非法阻塞分配的左侧错误:HDLCompilers:247 -“mult.v”第 36 行对标量线“pv”的引用不是合法的 reg 或变量左值错误:HDLCompilers:106 -“mult.v”第 36 行非法左手非阻塞赋值错误:HDLCompilers:247-“mult.v”第 38 行对标量线“bp”的引用不是合法的 reg 或变量左值错误:HDLCompilers:106-“mult.v”第 38 行非法左侧非阻塞赋值
  • @Laleh ,您的回答存在 3 个主要问题。 (1) 代码只会在时间 0 执行(如何做可合成的连续程序块?)。 (2) 无限 for 循环(你能找出原因吗?)。 (3) 错误结果(非阻塞如何工作?)
  • 我知道!正如我提到的,这段代码有很多语义错误。我只是把它改成编译!
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2011-06-22
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多