verilog行为模型中的错误结果
尽管存在键入错误,但我主要担心执行默认语句的case构造 我将verilog行为模型中的错误结果,verilog,Verilog,尽管存在键入错误,但我主要担心执行默认语句的case构造 我将always@(in1,in2)更改为always@*,并观察到算术移位操作工作不正常。我更改了以下内容: 现在我得到了正确的结果 `timescale 1ns / 1ps module simpleBmul(res,in1,in2); output [15:0] res; input [7:0] in1,in2; reg [15:0] res; reg FF; initial begin FF=1'b0; re
always@(in1,in2)
更改为always@*
,并观察到算术移位操作工作不正常。我更改了以下内容:
现在我得到了正确的结果
`timescale 1ns / 1ps
module simpleBmul(res,in1,in2);
output [15:0] res;
input [7:0] in1,in2;
reg [15:0] res;
reg FF;
initial
begin
FF=1'b0;
res[15:0]=16'h00;
end
always @*
begin
res[15:8]=8'h00;
res[7:0]=in1;
FF=1'b0;
repeat(8)
begin
case({res[0],FF})
2'b00,
2'b11: ;
2'b10:{res[15:8]}=res[15:8]-in2;
2'b01:{res[15:8]}=res[15:8]+in2;
default:$display("\t\t\terror");
endcase
{res,FF}=$signed({res,FF})>>>1'b1;
end
end
endmodule
--------------------------------------------------------------
ouput:
at time 0 in1=00000000, in2=00000000, res=0000000000000000
at time 21 in1=01011000, in2=00110111, res=0001001011101000
at time 31 in1=00110101, in2=01011001, res=0001001001101101
抱歉打扰您,谢谢您的回复我不确定这是否是有意的,但您有:
else
$display("\t\t\terror");
{res,FF}={res,FF}>>>1'b1;
end
作为if语句的一部分,因为您没有使用begin-end语句,所以行{res,FF}={res,FF}>>>1'b1代码>始终被执行。在学习verilog时,我鼓励自由使用begin-end语句,因为我发现这是最常见的bug类型
您已经有效地编写了以下内容:
repeat(8) begin
if(({res[0],FF}==2'b00) | ({res[0],FF}==2'b11)) begin
; //Missing assignment
end
else if({res[0],FF}==2'b10) begin
res[15:8]=res[15:8]-in2;
end
else if({res[0],FF}==2'b00) begin
res[15:8]=res[15:8]+in2;
end
else begin
$display("\t\t\terror");
end
{res,FF}={res,FF}>>>1'b1; //Always execute
end
注意:我会避免使用手动灵敏度列表,如始终@(in1,in2)
替换为always@*
到目前为止您做了哪些调试?您的if else
语句非常奇怪,我不知道您想要实现什么。很高兴我们能提供帮助。如果答案是正确的,你能接受吗。