首先,对不起我的英语技能。
我正在学习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学生版
答案 0 :(得分:0)
AS工具提到84
看起来只是意外剪切和粘贴代码。
if语句,除非它们用于generate语句,否则需要在进程中包含(有些人称之为块)。这可以是initial
或always
。
对于组合逻辑:
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分支中指定,则无需合成工具添加锁存器,它将保留其值。