verilog行为模型中的错误结果

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

尽管存在键入错误,但我主要担心执行默认语句的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;
    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
语句非常奇怪,我不知道您想要实现什么。很高兴我们能提供帮助。如果答案是正确的,你能接受吗。