我收到此错误vlog-13069

时间:2016-01-04 20:52:10

标签: verilog modelsim

首先,对不起我的英语技能。

我正在学习Verilog,我有这段代码

module paralelo_serie ( data_in,clk,  D_serie, nSyn, Done );
input wire [12:0] data_in;
input clk;
output reg D_serie, nSyn, Done;
genvar i;

84 if (data_in == 0) Done= 1;
else....

当我尝试编译此代码时,收到此错误消息:

  

错误:(vlog-13069)C:/ Users / Pedro / Documents / master / asignaturas / primer cuatrimestre / Metodologiadediseñoyherramientas cad / proyecto digital / proyecto digital.v(84):near“=”:syntax错误,意外'='。

     

错误:C:/ Users / Pedro / Documents / master / asignaturas / primer cuatrimestre / Metodologiadediseñoyherramientas cad / proyecto digital / proyecto digital.v(84):( vlog-13205)范围内发现语法错误在'完成'之后。是否缺少'::'?

我是这种语言的初学者,我不知道发生了什么。我在代码中得到了这个错误几次,但我有时可以通过将reg更改为连线和其他时间更改阻塞分配到无阻塞来解决它...我真的不知道如何修复我真的得到了沮丧...请帮忙,你是我最后的希望......

抱歉,我忘记了,我使用的是modelsim 10.4学生版

1 个答案:

答案 0 :(得分:0)

AS工具提到84看起来只是意外剪切和粘贴代码。

if语句,除非它们用于generate语句,否则需要在进程中包含(有些人称之为块)。这可以是initialalways

对于组合逻辑:

always @* begin
  if (data_in == 0) begin 
    Done = 'b1;
  end
  else begin
     Done = 'b0; 
    //...
  end
end

未在else分支中定义Done将导致创建一个锁存器。

在学习的同时,我会建议使用开始结束语句和缩进代码,因为这有助于澄清代码结构并使拼写错误更容易被发现。

如果将Done留作电线,您可以使用:

assign Done = (data_in == 0) ;

另一方面,如果您希望同步驱动Done

always @(posedge clk) begin
  if (data_in == 0) begin 
    Done <= 'b1;
  end
  else begin
    //...
  end
end

请注意对非阻塞(<=)分配的更改,以正确模拟触发器行为。由于Done是一个完整的触发器(有状态),因此如果未在else分支中指定,则无需合成工具添加锁存器,它将保留其值。