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'
答案 0 :(得分:1)
if
通常用于always
或initial
块(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));
玩得开心!