verilog分配给不起作用的同一个变量

时间:2015-11-15 07:37:16

标签: variables crash verilog assign hdl

我对Verilog HDL有一个奇怪的问题。 我在我的代码中发现,如果我将变量乘以2,那么 将该值分配给同一个变量,它会搞得一团糟。 有时候,simv程序甚至会崩溃。我最初需要这样做, 因为我有一个转换或旋转一定量的for循环。但, 然后我发现不仅移动相同的变量不起作用,而且 此外,加法,减法,乘法或除法也不起作用。

所以在我的代码示例中,如果将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;

always@(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

这是运行simv后的输出(我删除了错误的垃圾......):

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

谢谢, Erik W。

1 个答案:

答案 0 :(得分:2)

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

常规连续作业和程序性连续作业之间的区别是:

  • 连续分配只能驱动有线/网络数据类型。程序分配只能驱动 reg 数据类型,而不能驱动网络。
  • 连续分配应出现外部程序块(总是,初始等),而后者必须在程序块内
  • 每次右侧表达式更改时,都会执行连续分配。程序分配取决于始终阻止的敏感性列表

always块一旦结束,assign语句的效果就会被删除。您必须添加deassign语句以保留代码中的值(我认为这不是真正的意图)或只是删除 assign语句。如下图所示:

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

有关assigndeassign的更多信息,请访问thisthisthis个链接。