2015-11-15 39 views
0

我对Verilog HDL有一个奇怪的问题。 我在我的代码中发现,如果我将一个变量乘以2,但是然后 将该值赋给同一个变量,它会全部搞砸了。 有时,simv程序甚至崩溃。我原本需要这样做, ,因为我有一个for循环移位或旋转一定的数量。但是, 然后我发现不仅移动相同的变量不起作用,但 ,加法,减法,乘法或除法也不起作用。verilog分配给相同的变量不起作用

所以在我的代码示例中,如果将a设置为16'b0001_0000_1010_0101,并将b设置为3,则可以获得16'b0000_0000_0000_0000的输出。请注意,我现在无视b ...我应该得到16'b0010_0001_0100_1010 ...但是出了问题。

所以,这是我的代码文件test.v:

// ALU module. 
module test(in1, in2, out1); 

input [15:0] in1; 
input [15:0] in2; 

output reg [15:0] out1; 

// Variables for shifting right and for rotating left or right. 
reg [15:0] shiftedValue; 

[email protected](in1, in2) 
begin 

assign shiftedValue = in1; 

assign shiftedValue = shiftedValue * 2; 

assign out1 = shiftedValue; 

// This display value is correct! 
// but it's still wrong in the test bench. 
$display("out1 == %b", out1); 

end 

endmodule 

module testStim; 

reg [15:0] a; 
reg [15:0] b; 
wire [15:0] c; 

// create ALU instance. 
test myTest(a, b, c); 

initial 
begin 

a = 16'b0001_0000_1010_0101; 
b = 3; 

#10 
$display("op1In == %b, op1Out == %b", a, c); 

$finish; 

end 

endmodule 

这是运行通气后输出(I剥离出来的错误的垃圾...):

out1 == 0010000101001010 
op1In == 0001000010100101, op1Out == 0000000000000000 

谢谢, Erik W.

回答

2

您已完成所谓的程序连续分配

定期连续分配和程序连续分配之间的差别是这样的:

  • 连续分配只能驱动线/净数据类型。程序分配只能驱动注册数据类型而不是网络。
  • 连续分配应出现外部程序块(总是,初始等),而后者必须在程序块内。
  • 连续分配每次执行右侧表达式的变化。程序性分配取决于总是阻塞的灵敏度列表

只要always块结束,删除assign语句的效果。您必须添加deassign声明来保留这些值(我认为这不是真正的意图)或者只需从代码中删除assign声明。如下图所示:

shiftedValue = in1; 
shiftedValue = shiftedValue * 2; 
out1 = shiftedValue; 

更多有关assigndeassign可在thisthisthis链接。

+0

谢谢,这样做更有意义。 – Erik343

+0

@ Erik343请接受关闭此问题的答案。 – sharvil111

相关问题