在verilog中,我有一个错误,我无法通过

时间:2015-03-08 14:05:20

标签: verilog

module data_path(
  input clk,
  input rst,
  input inc_pc,
  input load_mar,
  input load_mbr,
  input load_ir,
  input r_w,
  input [7:0] data_in,
  input load_ac,
  input mux_sel,
  output [7:0] ir_out);


  reg [3:0]var;
  reg [2:0]opcode;
  wire [3:0] w1,w2,w6;
  wire [7:0] w3,w4,w5;

  pc pc1(.rst(rst),.clk(clk),.inc_pc(inc_pc),.pc_out(w1));

  register1 mar(.rst(rst),.clk(clk),.load(load_mar),.in(w1),.out(w2));

  memory memory1(.add_in(w2),.data_in(data_in),.data_out(w3),.r_w(r_w));

  register2 mbr(.rst(rst),.clk(clk),.load(load_mbr),.in(w3),.out(w4));

  register1 ir(.rst(rst),.clk(clk),.load(load_ir),.in(w4),.out(w5));

  assign opcode=w4[7:5];

  if(opcode==3'b000)
    register1 ac(.rst(rst),.clk(clk),.load(load_ac),.in(w4[4:0]),.out(w6));
  else
    if(opcode==3'b001)
    begin
        assign var=w6+w4[4:0];
        register1 ac(.rst(rst),.clk(clk),.load(load_ac),.in(var),.out(w6));
    end
endmodule

获取错误:

data_path.v line 52 expecting 'endmodule', found 'if'

3 个答案:

答案 0 :(得分:1)

if通常用于alwaysinitial块(Procedural Blocks;因此,如果在程序块之外,您无法检查操作码。尝试移动如果在always @ (posedge clk)内。

你也应该将register1 ac(.rst(rst),.clk(clk),.load(load_ac),.in(w4[4:0]),.out(w6));实例化移到if之外,因为你描述了硬件并且没有Conditional instantiation of verilog modules

答案 1 :(得分:1)

如果'register1'是另一个Verilog模块,则该逻辑不起作用。在您的代码中,您正在使用Verilog模块的输出(在静态运行时未知但在每个时钟周期更改),以确定要实例化的两个实例中的哪一个。

实例将从运行时开始存在,并且不能在每个时钟周期进入和不存在。相反,您必须将'register1 ac'的两个实例创建为两个独立的实例(具有不同的名称,并且其输出的名称不同)。然后使用多路复用器(多路复用器)在两个输出总线之间进行选择,具体取决于'操作码'的值。

答案 2 :(得分:1)

两个先前的答案都能正确捕获一些信息。您正在尝试根据操作码将输入复用到register1。有点怪异的是,您基于if-else发送4b或5b。我让它滑动,并假设现在没有符号扩展的5b。您的输出也是4b。

另一件事。操作码3'b001 add(不会在您的分配中累加)溢出-如何可靠地将4b(w6)+ 5b(w4 [4:0])添加到4b(var)中?

这是(未经测试,谨慎的)代码修订版(上面的代码段)。

声明要根据操作码进行多路复用的导线。

wire [7:0] tmpin;

现在正确编写常态以捕获行为

always @(*) begin
   if(opcode==3'b000)        tmpin = {3'b0,w4[4:0]};
   elsif (opcode == 3'b001)  tmpin = {4'b0,w6} + w4;
end

然后,您只需将多路复用变量放入并发语句(寄存器声明)中即可。

register1 ac(.rst(rst),.clk(clk),.load(load_ac),.in(tmpin[4:0]),.out(w6));

玩得开心!